树的抽象数据类型定义
若|D|=0,则称为空树;
否则:
(1) 在D中存在唯一的称为根的数据元素root,
(2) 当n>1时,其余结点可分为m (m>0)个互不相交的有限集T1, T2, …, Tm,其中Ti本身是一棵符合本定义的树,称为根root的子树。
例如:A是根;其余结点分成三个互不相交的子集,T1={B,E,F,K,L}; T2={C,G};T3={D,H,I,J,M};T1,T2,T3都是根A的子树,且本身也是一棵树。
树的表示方法
- 图
-
凹入表示法
-
嵌套集合表示法
-
广义表
树的基本术语
- 结点:数据元素+若干指向子树的分支
- 结点的度:分支的个数
- 树的度:树中所有结点的度的最大值
- 叶子节点:度为零的结点
- 分支(非终端)结点:度大于零的结点
- (从根到结点的)路径:由从根到该结点所经分支和结点构成
- 祖先结点、双亲结点、兄弟结点、堂兄弟节点、孩子结点、子孙结点:
- 结点的层次:假设根结点的层次为0(或者为1),第 i 层结点的子树的根结点的层次为 i(或者为i-1)
- 树的深度:树中叶子结点所在的最大层次
- 有向树:(1) 有确定的根;(2) 树根和子树根之间为有向关系
- 有序树:子树之间存在确定的次序关系
- 无序树:子树之间不存在确定的次序关系
- 森林:是 m(m≥0)棵互不相交的树的集合
- 任何一棵非空树是一个二元组 Tree = (root,F)其中:root 被称为根结点,F 被称为子树森林
树的结构特点
线性结构 | 树型结构 |
---|---|
第一个数据元素无前驱 | 根结点(无前驱) |
最后一个数据元素(无后继) | 多个叶子结点(无后继) |
其它数据元素(一个前驱、一个后继) | 其它数据元素(一个前驱、多个后继) |
树的存储结构
双亲标示法
用一组连续空间存储树的结点,同时在每个结点中附设一个指示器指示其双亲结点在链表中的位置。
孩子链表表示法
每个结点的孩子结点用单链表存储,再用含n个元素的结构数组指向每个孩子链表。
带双亲的孩子链表表示法
- 双亲表示法,PARENT(T,x)可以在常量时间内完成,但是求结点的孩子时需要遍历整个结构。
- 孩子链表表示法,适于那些涉及孩子的操作,却不适于PARENT(T,x)操作。
- 将双亲表示法和孩子链表表示法合在一起,可以发挥以上两种存储结构的优势,称为带双亲的孩子链表表示法
孩子兄弟存储表示法
树的孩子兄弟存储表示法,又称为二叉树表示法,以二叉链表作为树的存储结构。
树的遍历
先序遍历(Pre-order)根-左-右
先根(次序)遍历:若树不空,则先访问根结点,然后依次先根遍历各棵子树。
中序遍历(In-order)左-根-右
在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。
后序遍历(Post-order)左-右-根
后根(次序)遍历:若树不空,则先依次后根遍历各棵子树,然后访问根结点。
按层次遍历
按层次遍历:若树不空,则自上而下自左至右访问树中每个结点。