数据结构与算法分析笔记(8)——二叉树和树

树是数据元素(结点)之间具有层次关系的非线性结构。在树结构中,除根以外的结点只有一个前驱结点,可以有零至多个后继结点。根结点没有前驱结点。

树定义

(tree)是由n(n>=0)个结点组成的有限集合(树中元素通常称为结点)。n=0的树称为空树;n>0的树T 由以下两个条件约定构成:

1.有一个特殊的结点称为(root)的结点,它只有后续结点,它只有后续结点,没有前驱结点。

2.除根结点之外的其他结点分为m(m>=0)个互不相交的集合T0,T1,T2……Tm-1,其中每个集合Ti(0<=i<=m)本身又是一棵树,称为根的子树(subtree)。

树的术语

1.父母、孩子与兄弟结点

结点的前驱结点称为其父母(parent)结点,结点的后继结点称为其孩子(child)结点。一棵树中,只有根结点没有父母结点,其他结点有且只有一个父母结点。

拥有同一个父母结点的多个结点之间称为兄弟(sibling)结点。

结点的祖先(ancestor)是指其父母结点,以及父母的父母结点等,直至根结点。结点的后代(descendant,也称子孙)是指其所有孩子结点,以及孩子的孩子结点。

2.度

结点的度(degree)是结点所拥有子树的棵树。

度为0的结点称为叶子(leaf)结点,又称为终端结点;树中除叶子结点之外的其他结点称为分支结点,又称为非叶结点或非终端结点。

3.结点的层次、树的高度

结点的层次(level)属性反映结点处于树中的层次位置。约定根结点的层次为1,其他结点的层次是其父母结点的层次加1。

二叉树

二叉树:二叉树是n(n≥0)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为根的左子树和右子树的、互不相交的二叉树组成。
二叉树的结点最多有两棵子树,且子树有左右之分,不可颠倒。这是二叉树和有序树的不同之处。

严格二叉树:所有结点的度都不为 1的非空二叉树。即结点或者是叶结点,或者度为2。英文翻译为 strictly binary tree or full binary tree or two-tree
满二叉树:所有叶子结点在同一层上,除叶子结点外的所有结点均有两个子结点。节点数达到最大值。英文翻译为perfect binary tree

数据结构与算法分析笔记(8)——二叉树和树_第1张图片

满二叉树

一棵满二叉树t,高度为h,从第0层到第h层。第k层的结点数目为数据结构与算法分析笔记(8)——二叉树和树_第2张图片,总结点数目为数据结构与算法分析笔记(8)——二叉树和树_第3张图片

完全二叉树:除了最低层外,每一层都是满的,最低层上的叶结点尽可能地靠近左边。英文翻译为complete binary tree

数据结构与算法分析笔记(8)——二叉树和树_第4张图片


完全二叉树 共n个结点,每一个结点都和同样深度的满二叉树的前n个编号的结点一一对应。若位置i处的结点有子结点,则其左子结点位置为2i+1,右子结点位置为2i+2。一棵完全二叉树的所有元素可以存储在一个数组里,位置i处的元素可以放在数组索引i处

二叉树的性质

性质1  在二叉树的第i层上至多有2i-1个结点(i>=1)

    证明 采用归纳法证明此性质。

    当i=1时,只有一个根结点,2i-1=20 =1,命题成立。

    现在假定对所有的j,1<=j2j-2个结点,

    那么可以证明j=i时命题也成立。由归纳假设可知,第i-1层上至多有2i-2个结点。

    由于二叉树每个结点的度最大为2,故在第i层上最大结点数为第i-1

    层上最大结点数的二倍, 即2×(2i-2)=2i-1

性质2  深度为k的二叉树至多有2k-1个结点(k>=1)。

    证明  第i层的结点数为xi(1≤i≤k),深度为k的二叉树的结点数为M,xi最多为2i-1,则有:

性质3  对于一棵非空的二叉树,如果叶子结点数为n0,度数为2的结点数为n2,则有n0=n2+1

    证明   设二叉树中度为1的结点数为n1,二叉树中总结点数为N,因为二叉树中所有结点均小于或等于2,所以有:

N=n0+n1+n2             (5-1)

    再看二叉树中的分支数,除根结点外,其余结点都有一个进入分支,设B为二叉树中的分支总数,则有:

N=B+1。

    由于这些分支都是由度为1和2的结点发出的,所以有:

      B=n1+2*n2          

      N=B+1=n1+2×n2+1      (5-2)

    由式(5-1)和(5-2)得到:

      n0+n1+n2 = n1+2×n2+1

      n0=n2+1

性质4  具有n个结点的完全二叉树的深度k为 。

   证明  设所求完全二叉树的深度为k,根据完全二叉树的定义和性质2可知,k-1层满二叉树的结点个数为n时,有

                     2k-1-1

即                       2k-1≤n<2k

对不等式取对数,有

                     k-1≤log2n

由于k是整数,所以有k-1=,k=,结论成立。

    性质5  如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到第 +1层,每层从左到右),则对任一结点i(1<=i<=n),有:

    (1)如果i=1,则结点i无双亲,是二叉树的根;如果i>1,则其双亲是结点。

    (2)如果2i>n,则结点i为叶子结点,无左孩子;否则,其左孩子是结点2i。

    (3)如果2i+1>n,则结点i无右孩子;否则,其右孩子是结点2i+1。

    此外,若对二叉树的根结点从0开始编号,则相应的i号结点的双亲结点的编号为(i-1)/2,左孩子的编号为2i+1,右孩子的编号为2i+2。

    此性质可采用数学归纳法证明。证明略。

这个性质是一般二叉树顺序存储的重要基础。

二叉树的遍历
先根次序:访问根结点,遍历左子树,遍历右子树。
中根次序:遍历左子树,访问根结点,遍历右子树。
后根次序:遍历左子树,遍历右子树,访问根结点。






你可能感兴趣的:(Java数据结构及算法)