数据结构
9.树和二叉树
1.1树的概念
树(Tree):是由n(n≥0)个结点构成的有限集合T。若n=0称为空树。否则,一个非空树需满足以下两个条件:
(1)有且只有一个特定的称为根(root)的结点;
(2)除根结点以外的其它结点被分成m(m≥0)个互不相交的有限集合
T
1
,
T
2
,
…
,
T
m
T_1,T_2,…,T_m
T1,T2,…,Tm,其中每个集合又是一棵树。其中树
T
1
,
T
2
,
…
,
T
m
T_1,T_2,…,T_m
T1,T2,…,Tm称作树根的子树(subtree)。
根节点:唯一的没有前驱的结点,图中为A
叶结点:没有后继的结点,图中为E、F、K、L、H、I、J
结点的度:结点的后继的数量。A的度为3,C的度为3
树的度:结点的度的最大值,该树的度为3
儿子(孩子)结点:结点的后继结点。A的儿子结点为B C D
父亲(双亲)节点:结点的前驱结点。B C D的父亲节点为A
兄弟节点:父亲结点相同的结点,比如B C D互为兄弟节点。
堂兄弟结点:父亲结点互为兄弟结点的结点。E H互为堂兄弟结点
祖先节点:K结点的祖先节点包括A C G,就一条链往上回溯即可
子孙节点:A结点的分支和分支的分支往下都是它的子孙结点,对于C来说,G H I K L均为它的子孙节点
结点所处层次:图中显然,比如A在第一层,K L在第四层
树的高度:有几层高度就是几。该树高度为4
森林:多棵树构成森林
有序树:计算机的存储是有序的,为方便计算机处理,往往把子结点按从左到右的次序顺序编号,即把树作为有序树(ordered tree)看待。(结点的子树在树中的位置固定,不能互换)
1.2二叉树的定义
二叉树(Binary Tree)的递归定义:二叉树是n(n≥0)个结点的有限集合,该集合或者为空(n=0),或者由一个根结点及两棵互不相交的左、右子树构成,而其左、右子树又都是二叉树。图中B的孩子D叫右孩子,D的孩子E叫左孩子。
度为2的有序树是二叉树吗?
不是,因为在有序树中,删除某个度为2的结点的第一子树后,第二子树自然顶替成为第一子树。而在二叉树中,若删除某结点的左子树,则左子树为空,右子树仍然是右子树。
1.3二叉树的概念和术语
满二叉树(full binary tree):如果一棵二叉树中任意一层的结点个数都达到了最大值,则此二叉树称为满二叉树。一棵高度为k的满二叉树具有 2 k − 1 2^k-1 2k−1个结点
如果一个结点的编号为i,那么其左孩子编号为2i,右孩子编号为2i+1。若其左孩子被删,右孩子的编号不会改变,仍是2i+1。
其父亲结点的编号也可以求得,为i/2,向下取整。
完全二叉树(complete binary tree):对于深度为k,有n个结点的完全二叉树,其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应。
所以完全二叉树的k层,前k-1层都是满的,第k层可能满也可能不满。
完全二叉树的特征:
(1)叶子结点只可能在层次最大的两层上出现。
(2)任一结点,若其左分支下的子孙的最大层次为L,则其右分支下的最大层次为L或L-1,即若某结点无左子树,则该结点一定没右子树。
(3)满二叉树必为完全二叉树,而完全二叉树不一定是满二叉树。
1.4二叉树的性质
性质1:一棵非空二叉树的第i层上最多有
2
i
−
1
2^{i-1}
2i−1个结点(i≥1)。
证明:
- 当i=1时,二又树只有一个结点即根结点,24-1=20=1,命题成立。
- 假设i=k时结论成立,即第k层上至多有2*-1个结点。*
- 由归纳假设可知,第k+1层上至多有2个结点,因为二又树的每个结点的度至多为2,所以在第k+1层上的最大结点数为第k层上的最大结点数的2倍,即2×2*-1=2*。
- 综上,命题成立。
性质2:一棵高度为k的二叉树,最多具有 2 k − 1 2^k-1 2k−1个结点。
证明:
-
这棵二叉树中的每一层的结点个数必须最多。
-
根据性质1,第层的结点数最多为等于 2 i − 1 2^{i-1} 2i−1,
-
因此结点个数N最多为:
∑ i = 1 k 2 i − 1 = 2 k − 1 \sum_{i=1}^{k}2^{i-1}=2^k-1 i=1∑k2i−1=2k−1
性质3:任何一棵二叉树中,若叶子数为 n 0 n_0 n0,度为2的结点数为 n 2 n_2 n2,则 n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1。
性质4:具有n个结点的完全二叉树的高度 k = ⌈ l o g 2 ( n + 1 ) ⌉ o r ⌊ l o g 2 ( n + 1 ) ⌋ + 1 k=\lceil log_2(n+1)\rceil or \lfloor log_2(n+1)\rfloor+1 k=⌈log2(n+1)⌉or⌊log2(n+1)⌋+1。 ⌈ ⌉ \lceil \rceil ⌈⌉为向上取整符, ⌊ ⌋ \lfloor \rfloor ⌊⌋为向下取整符。
性质5:如果对一棵有n个结点的完全二叉树按层次自上而下(每层自左而右)对结点从1到n进行编号,则对任意一个结点
i
(
1
≤
i
≤
n
)
i(1≤i≤n)
i(1≤i≤n)有:
(1)若
i
=
1
i=1
i=1,则结点
i
i
i为根,无双亲;若
i
>
1
i>1
i>1,则结点
i
i
i的双亲结点的编号是
⌊
i
/
2
⌋
\lfloor i/2 \rfloor
⌊i/2⌋。
(2)若
2
i
≤
n
2i≤n
2i≤n,则
i
i
i的左孩子的编号是
2
i
2i
2i,否则i无左孩子。
(3)若
2
i
+
1
≤
n
2i+1≤n
2i+1≤n,则i的右孩子的编号是
2
i
+
1
2i+1
2i+1,否则
i
i
i无右孩子。