**树**
树型结构是一类非常重要的非线性结构。直观地,树型结构是以分支关系定义的层次结构
树能干什么:
树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构;在数据库系统中,可用树来组织信息;在分析算法的行为时,可用树来描述其执行过程等等。
接下来我们来认识一下树:
树(Tree)是n(n≧0)个结点的有限集合T,若n=0时称为空树,否则:
⑴ 有且只有一个特殊的称为树的根(Root)结点;
⑵ 若n>1时,其余的结点被分为m(m>0)个互不相交的子集T1, T2, T3…Tm,其中每个子集本身又是一棵树,称其为根的子树(Subtree)。
注意:
1、子树是不相交的。
2、除了根节点以外, 每个节点有且仅有一个父节点。
3、一棵N个节点的树有N-1条边。
树的术语:
树的节点:即树的数据元素
结点的度:结点拥有的子树数(有几个直接后继就是几度,亦称“次数”)
结点的层次:从根到该结点的层数(根结点算第一层)
终端结点:即度为0的结点,即叶子
分支结点:即度不为0的结点(也称为内部结点)
树的度:所有结点度中的最大值(Max{各结点的度})
树的深度:指所有结点中最大的层数(Max{各结点的层次})
上图中的结点数=13 ;树的度=3 ;树的深度=4
根:即根结点(没有前驱)
叶子:即终端结点(没有后继),度数为0的结点
有序树:结点各子树从左至右有序,不能互换(左为第一)
无序树:结点各子树可互换位置。
双亲:即上层的那个结点(直接前驱)
孩子:即下层结点的子树的根(直接后继)
兄弟:同一双亲下的同层结点(孩子之间互称兄弟)
堂兄弟:即双亲位于同一层的结点(但并非同一双亲)
祖先:即从根到该结点所经分支的所有结点
子孙:即该结点下层子树中的任一结点
二叉树:
定义:是n(n≥0)个结点的有限集合,由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成 。
基本特征:① 每个结点最多只有两棵子树(不存在度大于2的结点),即每个结点的度只可能是0,1,2 ;
② 左子树和右子树次序不能颠倒(有序树)。
二叉树五种基本形态:
(a) 空二叉树(Empty tree)
(b) 仅有根结点的二叉树 (Only root node)
© 右子树为空的二叉树 (Right subtree empty)
(d) 左子树为空的二叉树 (Left subtree empty)
(e) 左、右子树均非空的二叉树
二叉树性质:
性质1 : 在二叉树的第i层上至多有2i-1个结点(i≥1)。 最少有1个结点。
性质2:深度为k的二叉树至多有2k – 1个结点(k≥1)。最少有k个结点。
性质3: 对于任何一棵二叉树,若度为2的结点数有n2个,则叶子数(n0)必定为n2+1 (即n0=n2+1)
证明:
∵ 二叉树中全部结点数n=n0+n1+n2(叶子数+1度结点数+2度结点数)
又∵二叉树中全部结点数n=B+1 ( 总分支数+根结点 )
(除根结点外,每个结点必有一个直接前趋,即一个分支)
而 总分支数B= n1+2n2 (1度结点必有1个直接后继,2度结点必有2个)
三式联立可得: n0+n1+n2= n1+2n2 +1, 即n0=n2+1
实际意义:叶子数=2度结点数+1
example:
已知一棵二叉树中,有20个叶子结点,10个结点只有左孩子,
15个结点只有右孩子,则该二叉树的总结点数(64).
N=n0+n1+n2
= n0+n1+n0 – 1
= 2n0 + n1 – 1 = 64
满二叉树:一棵深度为k且有2k – 1个结点的二叉树
深度为4的满二叉树
完全二叉树:有n个结点的二叉树,对树中的结点按照从上到下,从左到右的顺序进行编号,编号为i的结点与满二叉树中编号为i的结点位置一样。
二叉树的存储方式:
用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,将完全二叉树编号为i(从1开始编号)的结点存储在下标为i-1的单元内(数组的起始地址为0)
链式存储二叉树:
二叉树的遍历:
先序遍历:(1)访问根结点;
(2)先序遍历左子树;
(3)先序遍历右子树;
先序遍历:FCADBEHGM
中序遍历:(1)中序遍历左子树
(2)访问根结点
(3)中序遍历右子树
中序遍历:DBGEACF
后序遍历:
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根结点
上图的后序遍历:DGEBFCA
口诀:
DLR—先序遍历,即先根再左再右
LDR—中序遍历,即先左再根再右
LRD—后序遍历,即先左再右再根
EX:
其先序序列为: -+a* b-cd/ef
其中序序列为: a+b* c-d-e/f
其后序序列为: abcd-*+ef/-
特别讨论:若已知先序/后序遍历结果和中序遍历结果,能否“恢复”出二叉树?
由一棵二叉树的先序/后序遍历结果和中序遍历结果,可唯一确定这棵二叉树。但是已知先序和后序遍历,是不能确定 一颗二叉树的。
例:已知一棵二叉树的中序序列和后序序列分别是BDCEAFHG 和 DECBHGFA,请画出这棵二叉树。
分析:
①由后序遍历特征,根结点必在后序序列尾部(即A);
②由中序遍历特征,根结点必在其中间,而且其左部必全部是左子树子孙(即BDCE),其右部必全部是右子树子孙(即FHG);
③继而,根据后序中的DECB子树可确定B为A的左孩子,根据HGF子串可确定F为A的右孩子;以此类推。
比如前序遍历是ABC,后序遍历是CBA。我们可以确定A一定是根结点,但接下来,我们无法知道,哪个结点是左子树,哪个是右子树。这棵树有可能有如图所示的四种可能。