一、树与二叉树的定义
树(Tree): 是n(n>=0)个有限数据元素的集合。
在任意一颗非空树中:
(1)有且只有一个特定的称为树根(Root)的结点,根结点无前驱结点。
(2)当n>1时,除根节点之外的其余结点可以分成m(m>0)个互不相交的集合T1,T2,......,Tm,其中每一个集合Ti(1<=i<=m)本身有事一颗树,并且称为根的子树。
下面是与树有关的术语:
结点:一个数据元素及若干指向其子树的分支信息。(图中有10个结点)
结点的度:一个结点的子树的个数称为结点的度。(结点“D”的度为3,结点“C”的度为2,结点“J”的度为0)
叶子结点:度为0的结点,也成为终端结点。(结点“G、H、I、J、F”均为叶子结点)
分支结点:度不为0的结点称为分支结点,也成为非终端结点。
兄弟结点:同一父亲结点下的子结点,也称为兄弟结点。
树的层数:树的根结点的层数为1,其余结点的层数等于它双亲结点的层数加1.(图中树的层数为4)
树的度:树中所有结点中度的最大值称为该树的度。(图中树的度为3)
树的深度:树中结点的最大层数称为树的深度。
森林:零颗或有限颗互不相交的树的集合称为森林。
有序树和无序树:如果树中结点的各子树从左到右是有次序的(不能互换位置),则这样的树称为有序树,否则称为无序树。
二叉树(Binary Tree):二叉树是n个结点的集合,该集合或者为空,或者是由一个根节点和两颗互不相交的分别称作根的左子树和右子树的两个集合组成,左子树和右子树又同样都是一颗二叉树。(二叉树实际上是度为2的有序树),在二叉树中,每个结点的左子树的根结点称为左孩子,右子树的根结点称为右孩子。
二叉树的性质总结:
1:在二叉树的第i层上至多有2i-1个结点(i>=1)。
2:深度为k的二叉树至多有2k-1个结点(k>=1)。
3:对任何一颗二叉树T,如果其终端结点数为n0,度为2的 结点 数为n2,则n0 = n2+1.
4:具有n个结点的完全二叉树深度为[log2n]+1 ([x]表示不 大于 x的最大整数)。
5:如果对一颗有n个结点的完全二叉树(其深度为[log2n]+1) 的结点按层序编号(从第1层到第[log2n]+1层,每层从左到 右),对任意一个结点i(1<=i<=n)有:
a. 如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点[i/2]
b. 如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i。
c. 如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1。
二叉树的分类:
满二叉树:一颗树中当第i层的结点数为2^(i-1)个时,则称为此层的结点数是满的,当树中的每一层都满时,称该树为完全二叉树。
完全二叉树:一颗二叉树中,除最后一层外,其余层都是满的。并且最后一层是满的或者只是在右边缺少连续若干个叶子节点。
注:满二叉树是完全二叉树的特例。
二、树与二叉树的相互转换
将一颗树转换为二叉树的方法如下:
(1)在树中所有相邻的兄弟之间加一条线。
(2)对于树中的每个结点,只保留它与第一个孩子结点之间的连线,删去与其它孩子结点间的连线。
(3)以树的根结点为轴心,将整棵树顺时针转动一定的角度,使之成为一颗二叉树。
树与二叉树的转换是可逆的,将二叉树转换为树的方法如下。
(1)若某结点是其双亲的左孩子,则把该结点的右孩子。右孩子的右孩子都与该节点的双亲结点用线连起来。
(2)删去原二叉树中所有的双亲结点与右孩子结点的连线。
(3)整理由(1)、(2)两步所得到的树。