二叉树的定义
二叉树是n(
n
≥
0
n\geq 0
n≥0)个结点的有限集,它或者是空集(n=0),或者是由一个根结点及两棵不相交的分别称作这个根的左子树和右子树的二叉树组成。
特点:
- 每个结点最多有俩孩子,即二叉树中不存在度大于2的结点。
- 子树有左右之分,其次序不能颠倒。
- 二叉树可以是空集合,根可以有空的左子树或空的右子树。
二叉树不是树的特殊情况,它们是两个概念
二叉树结点的子树一定要区分左子树和右子树,即使只有一棵子树也要区分,说明它是左子树,还是右子树。
树当结点只有一个孩子时,就无须区分它是左还是右的次序。因此,二者是不同的。这是二叉树和树的最主要区别。
一个例子来说明树和二叉树的区别:
具有3个结点的二叉树可能有几种形态?普通树又有几种?
- 二叉树有五种形态:
- 普通树有两种形态:
二叉树的5种基本形态如下:
虽然二叉树和树的概念不同,但有关树的基本术语对二叉树都适用。
二叉树的性质
- 性质1:在二叉树的第
i
i
i层上至多有
2
i
−
1
2^{i-1}
2i−1个结点(
i
≥
1
i\geq 1
i≥1)。
证明(数学归纳法):- 当 n = 1 n=1 n=1时,只有一个根结点, 2 n − 1 = 2 0 = 1 2^{n-1}=2^0=1 2n−1=20=1,命题成立。
- 假设当 n = i − 1 n=i-1 n=i−1时,命题成立,则第 i − 1 i-1 i−1层上有 2 i − 2 2^{i-2} 2i−2个结点。由于二叉树每个结点的度最大为2,故第 i i i层上最大结点数为第 i − 1 i-1 i−1层上最大结点数的2倍,所以当 n = i n=i n=i时,有 2 ∗ 2 i − 2 = 2 i − 1 2*2^{i-2}=2^{i-1} 2∗2i−2=2i−1。证毕。
第 i i i层上至少有1个结点。
- 性质2:深度为
k
k
k的二叉树至多有
2
k
−
1
2^k-1
2k−1个结点(
k
≥
1
k\geq1
k≥1)。
证明:根据性质,深度为 k k k的二叉树的最大结点数为:
∑ i = 1 k ( 第 i 层 的 最 大 结 点 数 ) = ∑ i = 1 k 2 i − 1 = 2 0 + 2 1 + ⋯ 2 k − 1 = 2 k − 1 \sum\limits_{i = 1}^k {(第i层的最大结点数) = \sum\limits_{i = 1}^k {{2^{i - 1}}} } = {2^0} + {2^1} + \cdots {2^{k - 1}} = {2^k} - 1 i=1∑k(第i层的最大结点数)=i=1∑k2i−1=20+21+⋯2k−1=2k−1
深度为 k k k的二叉树至少有 k k k个结点。
- 性质3:对任何一棵二叉树T,如果其叶子数为
n
0
n_0
n0,度为2的结点数为
n
2
n_2
n2,则
n
0
=
n
2
+
1
n_0=n_2+1
n0=n2+1。
证明:从两个角度看上图的二叉树- 自底向上看,所有结点都与其双亲之间有条边,只有根结点没有,所以,这里的总边数B为:
B = n − 1 B=n-1 B=n−1 - 自顶向下看,所有度为2的结点产生两条边,度为1的结点产生1条便,度为0的结点不产生边。所以,这里的总边数B为:
B = 2 n 2 + n 1 B=2n_2+n_1 B=2n2+n1
- 自底向上看,所有结点都与其双亲之间有条边,只有根结点没有,所以,这里的总边数B为:
所以, n − 1 = 2 n 2 + n 1 n-1=2n_2+n_1 n−1=2n2+n1,又 n = n 0 + n 1 + n 2 n=n_0+n_1+n_2 n=n0+n1+n2,所以得出性质3, n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1。
- 性质4和性质5都是关于完全二叉树。 下面先说明完全二叉树,在描述性质4和5。
满二叉树
-
满二叉树:一棵深度为 k k k且有 2 k − 1 2^k-1 2k−1个结点的二叉树称为满二叉树。
-
特点:
- 每一层上的结点数都是最大结点数,即每层都满。
- 叶子结点全部在最底层。
-
对满二叉树的结点位置进行编号,编号规则:从根结点开始,自上而下,自左而右。每一个结点位置都有元素。
上图不是满二叉树,从上图以及满二叉树的概念中可得出结论:- 满二叉树在同样深度的二叉树中结点个数最多;
- 满二叉树在同样深度的二叉树中叶子结点个数最多。
完全二叉树
-
完全二叉树:深度为 k k k的具有 n n n的结点的二叉树,当且仅当其每一个结点都与深度为 k k k的满二叉树中编号 1 − n 1- n 1−n的结点一一对应时,称之为完全二叉树。
-
判断一棵树是否是完全二叉树的方法:
在满二叉树中,从最后一个结点开始,连续去掉任意个结点,即是一棵完全二叉树。
特别注意一点:一定要是连续的去掉。 下图所示的树就不是一棵完全二叉树,因为I和J两结点不连续。
-
特点:
- 叶子只可能分布在层次最大的两层上。
- 对任一结点,如果其右子树的最大层次为i,则其左子树的最大层次必是i或i+1。
满二叉树一定是完全二叉树,而完全二叉树不一定是满二叉树。
- 性质4:具有n个结点的完全二叉树的深度为
⌊
log
2
n
⌋
+
1
\left\lfloor {\log _2^n} \right\rfloor + 1
⌊log2n⌋+1。
注: ⌊ x ⌋ \left\lfloor x \right\rfloor ⌊x⌋称作x的底,表示不大于x的最大整数。
证明:
如上图,位于第k层上的结点n的取值范围为 2 k − 1 ∼ 2 k − 1 2^{k-1}\sim2^k-1 2k−1∼2k−1。
所以有, 2 k − 1 ≤ n < 2 k {2^{k - 1}} \le n < {2^k} 2k−1≤n<2k
取对数,有, k − 1 ≤ log 2 n < k k - 1 \le \log _2^n < k k−1≤log2n<k
因为k是整数,所以有, k = ⌊ log 2 n ⌋ + 1 k=\left\lfloor {\log _2^n} \right\rfloor + 1 k=⌊log2n⌋+1
该性质表明了完全二叉树结点数n与完全二叉树深度k之间的关系。
- 性质5:如果一棵有n个结点的完全二叉树,则对任一结点
i
(
1
≤
i
<
n
)
i(1\le i<n)
i(1≤i<n),有:
(1)如果i=1,则结点i是二叉树的根,无双亲;如果 i > 1 i>1 i>1,则其双亲是结点 ⌊ i 2 ⌋ \left\lfloor {\frac{i}{2}} \right\rfloor ⌊2i⌋;
(2)如果 2 i > n 2i>n 2i>n,则结点i为叶子结点,无左孩子;否则,其左孩子是结点 2 i 2i 2i。
(3)如果 2 i + 1 > n 2i+1>n 2i+1>n,则结点i无右孩子;否则,其右孩子是结点 2 i + 1 2i+1 2i+1。
性质5可用数学归纳法证明。
性质5表明了完全二叉树中双亲结点编号与孩子编号之间的关系。