数据结构——树

树是一种用于表达层级结构的数据结构。软件开发中,常用树结构来抽象表达文档、组织结构图、图形图像等结构。

关于树结构本文讨论:有根树二叉树。


有根树:根(root)是唯一一个没有父结点的结点。我们将没有子节点的结点称为外部节点(external node)或者叶节点(leaf)。除叶结点以外的结点称为内部节点(internal node)。

有根树T中结点x的子结点数称为x的度(degree)。如果没有子结点,那么他的度为0。从根r到结点x的路径长度称为x的深度(depth)。另外,结点x到叶结点的最大路径长度称为结点x的高(height)。一棵树中根结点的高度最大,我们称其为树的高。


有根树的表示:首先我们考虑如何存储输入的有根树。由于本题输入完成后,结点树不在发生变化,所以利用“左子右兄弟表示法”来表示树。

左子右兄弟表示法的各节点具有以下信息①结点node的父结点

②结点node最左侧的子结点

③结点node右侧紧邻的兄弟结点

一些输出函数:

获得各点的深度可通过如下算法:求结点node的深度时,需要从node出发逐一寻找父结点,统计node到root一共的边数。

考察:递归计算深度的算法只需将各点遍历一遍,所以算法复杂度为O(n)

输出部分:


二叉树:一个根节点,且所有结点的子结点数不超过2。所以严格区分左右结点。不必通过"左子右兄弟表示法"。

所需数组即变量。

与有根树类似的求深度方法,只不过在找左右结点时deep+1。

遍历左右结点,取路径长的为高。

找兄兄弟结点,需返回父亲结点。

输出格式。

构造方法以及主函数:

输出:


想必你已经拥有了属于自己的二叉树,那么树的遍历操作(Tree Walk)显然是必不可少的。

按照根结点、左子树、右子树的顺序输出结点编号。称为树的前序遍历(Preorder Tree Walk)。

按照左子树、根结点、右子树的顺序输出结点编号。称为树的中序遍历(Inorder Tree Walk)。

按照左子树、右子树、根结点的顺序输出结点编号。称为树的后序遍历(Postorder Tree Walk)。

考察:二叉树遍历会对树的每一个结点进行一次访问,因此算法复杂度为O(n)。但是用递归实现遍历算法时要注意,一旦树的结点数量庞大且分布不均,很可能导致递归深度过深。


二叉树的重建(Reconstruction):知道二叉树的前序遍历和中序遍历的结果,可以得出后序输出的结果。

前序输入pre={1,2,3,4,5,6,7,8,9}

中序输入in={3,2,5,4,6,1,8,7,9}

可得到如下二叉树。

设Preorder遍历的当前结点为c,在in中位置为m,m的左侧就是c的左子树,后侧就是右子树。例如当前结点为1,其在in中的位置为 3 2 5 4 6 [1] 8 7 9,那么当前树的根为1,左右子树就是3 2 5 4 6和8 7 9,以此类推Preorder的下一个结点为2,则其左右子树为3和5 4 6。实现如下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录 1、什么是树 2、相关术语 3、二叉树 3.1、二叉树的类型 3.2、二叉树的性质 3.3、二叉树的结构 3...
    我哈啊哈啊哈阅读 2,633评论 0 10
  • 一. 树的定义 树是一种非线性的数据结构。它是n个结点的有限集合,一棵非空树具有以下的特点:(1)有且只有一个称为...
    yzbkaka阅读 481评论 0 1
  • 树是非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。 使用树结构存储的集合 {A,B,C,D,E,F,...
    飞扬code阅读 4,866评论 0 2
  • 1.树和二叉树的定义 (1) 树的定义 树是n (n≥0) 个结点的有限集。 n=0 时称为空树。在任意一棵非空树...
    yinxmm阅读 2,505评论 0 3
  • 这篇文章收录在我的 Github 上 algorithms-tutorial,另外记录了些算法题解,感兴趣的可以看...
    Lindz阅读 15,422评论 4 15