文章目录
-
- 二叉树
-
- 二叉树的定义
- 二叉树始终区分左右子树
- [二叉树有 5 种基本形态](#二叉树有 5 种基本形态)
- 二叉树与度为2的有序树的区别
- 特殊二叉树
- 满二叉树👺
- 完全二叉树
- 其他二叉树
- 二叉树的存储
- 二叉树的一般性质👺
二叉树
二叉树的定义
二叉树是一种特殊的树形结构,其特点是每个结点至多只有两棵子树 (即二叉树中不存在度大于 2 的结点 ),并且二叉树的子树有左右之分 ,其次序不能任意颠倒。
与树相似,二叉树也以递归的形式定义。二叉树是 n n n ( n ≥ 0 n \geq 0 n≥0) 个结点的有限集合:
- 或者为空二叉树,即 n = 0 n = 0 n=0。
- 或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。
虽然二叉树名字上看会有分叉,但是二叉树允许只有单子树,甚至空树都满足二叉树的定义
二叉树始终区分左右子树
二叉树是有序树,若将其左、右子树颠倒,则成为另一棵不同的二叉树。即使树中结点只有一棵子树,也要区分它是左子树还是右子树。
二叉树有 5 种基本形态
- 空树
- 只有根节点的树
- 只有左子树
- 只有有子树
- 左右子树都有
这5种情况会让一些算法需要判断的情况比较多
二叉树与度为2的有序树的区别
-
度为2的树至少有3个结点 ,而二叉树可以为空。
-
二叉树无论其孩子数是否为2,均需确定其左右次序,即二叉树的结点次序是绝对的,不是相对于另一结点而言的,而是确定的。
-
度为2的有序树的孩子的左右次序是相对于另一个孩子而言的,若某个结点只有一个孩子,则这个孩子就无须区分其左右次序
特殊二叉树
本节着重于满二叉树和完全二叉树,满二叉树可以视为完全二叉树的一种特殊情况
满二叉树👺
一颗高度为 h h h的二叉树 T T T,其结点数量为 2 h − 1 2^{h}-1 2h−1,则该二叉树为满二叉树
- 所有层的结点数都是满的(尽可能多的)
- 所有的叶子结点都在底层
满二叉树有许多特有的性质,尤其是结点编号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
基本性质
设任意非根结点序号为 c c c和它的双亲结点序号 p p p
二叉树的第 i i i行元素最多为 L ( i ) = 2 i − 1 L(i)=2^{i-1} L(i)=2i−1,第 i − 1 i-1 i−1行元素就最多是 2 i − 2 2^{i-2} 2i−2;
前 i i i行元素最多为 S ( i ) = 2 i − 1 S(i)=2^i-1 S(i)=2i−1,第 i i i行第1个元素编号为 F ( i ) F(i) F(i)= S ( i − 1 ) + 1 S(i-1)+1 S(i−1)+1= 2 i − 1 − 1 + 1 2^{i-1}-1+1 2i−1−1+1= 2 i − 1 2^{i-1} 2i−1,显然第 i i i行第一个元素的编号是第 i − 1 i-1 i−1行是元素的编号的两倍
结点的双亲和孩子的序号关系👺
根据双亲结点求孩子结点序号,或根据孩子结点求双亲结点序号
对满二叉树结点进行层次编号,从根节点(根节点的编号为1)开始,自上而下、自左向右地分配每个节点的编号。
对于编号为 i i i 的节点,有以下性质:
- 如果有父亲,则其父亲的编号为 ⌊ i / 2 ⌋ \lfloor i/2 \rfloor ⌊i/2⌋(或者 ⌈ ( i − 1 ) / 2 ⌉ \lceil(i-1)/2\rceil ⌈(i−1)/2⌉);前者更简洁,通常用第一个表达式
- 如果有左孩子,则左孩子的编号为 2 i 2i 2i;
- 如果有右孩子,则右孩子的编号为 2 i + 1 2i + 1 2i+1
这些表达式对于二叉树(尤其是完全二叉树)的顺序存储很重要,通过计算 2 i , 2 i + 1 2i,2i+1 2i,2i+1来计算第 i i i个结点的孩子结点应该放到数组的那个位置(通常从1开始计数)
i/2\] i ... 2i 2i+1
我们可以通过观察和归纳容易得到次规律,也可以通过推理的方式来验证
#### 推导1
设树中的第 p p p个结点是满二叉树第 i i i行的元素,并且设 p p p= S ( i − 2 ) + t S(i-2)+t S(i−2)+t,则 p p p的左孩子序号为 l = S ( i − 1 ) + 2 ( t − 1 ) + 1 l=S(i-1)+2(t-1)+1 l=S(i−1)+2(t−1)+1
分被化简两个表达式 p = 2 i − 2 − 1 + t p=2\^{i-2}-1+t p=2i−2−1+t, l = 2 i − 1 − 2 + 2 t l=2\^{i-1}-2+2t l=2i−1−2+2t,可见 l = 2 p l=2p l=2p;类似的 r = l + 1 = 2 p + 1 r=l+1=2p+1 r=l+1=2p+1
这就证明了第2,3条性质
对于第一条,利用现有2,3两条性质
若 c c c表示树中某个结点,求其双亲结点 p p p,由上述讨论可知 c = 2 p c=2p c=2p或 c = 2 p + 1 c=2p+1 c=2p+1,分被对应于 c c c是 p p p的左孩子和右孩子的情况;可以看出,若结点 c c c是偶数时,一定是其双亲结点 p p p的左孩子,若 c c c为奇数,则 c c c是 p p p的右孩子
可以用映射关系
p = { c / 2 , c m o d 2 = 0 ( c − 1 ) / 2 , c m o d 2 = 1 p=\\begin{cases} c/2,\&c\\mod{2}=0\\\\ (c-1)/2,\&c\\mod{2}=1 \\end{cases} p={c/2,(c−1)/2,cmod2=0cmod2=1
由于 p , c p,c p,c都是整数,我们可以试图找到某个统一的映射 f f f,使得 p = f ( 2 c ) = f ( 2 c + 1 ) = c p=f(2c)=f(2c+1)=c p=f(2c)=f(2c+1)=c
这样的映射不是唯一的,比如可以取 f ( x ) = ⌊ x 2 ⌋ f(x)=\\lfloor{\\frac{x}{2}}\\rfloor f(x)=⌊2x⌋;也可以取 f ( x ) = ⌈ x − 1 2 ⌉ f(x)=\\lceil\\frac{x-1}{2}\\rceil f(x)=⌈2x−1⌉
所以 c c c的双亲结点 p = ⌊ 1 2 c ⌋ p=\\lfloor\\frac{1}{2}c\\rfloor p=⌊21c⌋= ⌈ c − 1 2 ⌉ \\lceil \\frac{c-1}{2}\\rceil ⌈2c−1⌉,这就得到了第1条性质
#### 推导2
* 假设结点p具有孩子结点(非叶子结点)
* p p p的左孩子: c l = 2 p c_l=2p cl=2p前面讨论过,完全二叉树的按层编号来看每一层的第一个结点的序号为$2\^{i-1} $
我们设双亲结点 p p p所在的层为 h h h层,那么在 h h h层位于结点 p p p之前的结点数为 p − 2 h − 1 p-2\^{h-1} p−2h−1
而 p p p的孩子结点位于第 h + 1 h+1 h+1层,该层的第一个元素编号为 2 h 2\^h 2h
那么在 h + 1 h+1 h+1层,结点 p p p的左孩子结点 l l l之前的结点数量为 l − 2 h l-2\^h l−2h个
* 根据满二叉树的特点, l − 2 h l-2\^{h} l−2h= 2 ( p − 2 h − 1 ) 2(p-2\^{h-1}) 2(p−2h−1)
* 容易知道结点数量关系: l − 2 h = 2 ( p − 2 h − 1 ) l-2\^h=2(p-2\^{h-1}) l−2h=2(p−2h−1)
从而得到 l = 2 p l = 2p l=2p
* 则 i i i的右孩子 r = l + 1 = 2 p + 1 r=l+1=2p+1 r=l+1=2p+1
### 完全二叉树
高度为 h h h、有 n n n 个结点的二叉树,当且仅当其每个结点都与高度为 h h h 的满二叉树中编号为 1 ∼ n 1 \\sim n 1∼n 的结点一一对应时,称为完全二叉树,
1 2 3 4 5 6 7 8 9 10 11 12 \^
完全二义树可视为从满二叉树中删去若干最底层、最右边的一些连续叶结点后所得到的二叉树。
满二叉树的元素编号规律在完全二叉树中也适用,例如指定结点的双亲结点或孩子结点的编号计算,由于最后一层和倒数第二层的部分结点和满二叉树有差异,因此有更多性质需要讨论,比如1度结点,叶结点分布,倒数第二层有叶结点,且至少有一个叶结点;还要讨论**分支结点**(非叶结点)的孩子情况
当完全二叉树中的最后一个分支结点只有2个孩子,那么是正则完全二叉树,否是非正则的
和满二叉树不同,仅完全二叉树在第 t t t层有 k k k个结点无法确定该完全二叉树的唯一形状;因为除非指明完全二叉树的层数 h = t h=t h=t,否则叶子结点还可能分布在 t + 1 t+1 t+1层
例如:已知一棵完全二叉树的第6层有8个叶子结点,则该树的结点数最大值 M M M?
* 满足条件的完全二叉树有第7层,第6层是满的,共有 2 5 = 32 2\^{5}=32 25=32个结点,由于第6层有8个叶子结点,所以分支结点有 32 − 8 = 24 32-8=24 32−8=24个,最后一个分支结点编号是 2 5 − 1 + 24 = 55 2\^{5}-1+24=55 25−1+24=55
* 根据完全二叉树的编号性质,此时最后一个结点编号为 55 55 55号结点的右孩子,即 2 × 55 + 1 = 111 2\\times{55}+1=111 2×55+1=111,所以 M = 111 M=111 M=111
* 或者:计算出第7层的叶子结点然后和前6层的结点数量 2 6 − 1 = 63 2\^{6}-1=63 26−1=63相加;第7层的叶子结点数量最大值取决于第6层分支结点数量: 2 5 − 8 = 24 2\^{5}-8=24 25−8=24,所以第7层最多有 48 48 48个结点,所以 M = 111 M=111 M=111
#### 完全二叉树的性质特点👺
其特点如下:
1. 若 i ≤ ⌊ n / 2 ⌋ i \\leq \\lfloor n/2 \\rfloor i≤⌊n/2⌋,则结点 i i i 为分支结点,否则为叶结点。
* 可用来计算结点数为 n n n的完全二叉树的叶结点数量: n 0 n_{0} n0= n − ⌊ n / 2 ⌋ n-\\lfloor{n/2}\\rfloor n−⌊n/2⌋
* 若已知某完全二叉树的叶结点数为 n 0 n_{0} n0,那么该树的结点数 n n n最多: 2 n 0 2n_{0} 2n0
* n 2 ⩽ n − ⌊ n / 2 ⌋ = n 0 \\frac{n}{2}\\leqslant{n-\\lfloor{n/2}\\rfloor}=n_{0} 2n⩽n−⌊n/2⌋=n0
* 可以得 n ⩽ 2 n 0 n\\leqslant{2n_{0}} n⩽2n0
2. **叶结点**只可能在层次最大的两层上出现。对于最大层次中的叶结点,都依次排列在该层最左边的位置上。
3. 若有度为 1 的结点,则最多只可能有一个(位于倒数第二层),且该结点只有左孩子而无右孩子。
4. 按层序编号后,一旦出现某结点(编号为 i i i)为**叶结点** (没有孩子)或**只有左孩子** ,则编号大于 i i i 的结点均为叶结点。(例如上例中多结点6只有左孩子,大于6的结点都是叶结点;从 i = 7 i=7 i=7号结点开始都是叶子结点
5. 结点总数的奇偶性和分支结点规律:
1. 若 n n n 为奇数,则每个**分支结点**都有左孩子和右孩子;
2. 若 n n n 为偶数,则编号**最大的分支结点** (编号为 n / 2 n/2 n/2)只有左孩子,没有右孩子,其余分支结点左、右孩子都有。
6. 对于编号为 p p p的结点
1. 若 2 p ⩽ n 2p\\leqslant n 2p⩽n时,则 p p p号结点有左孩子,否则没有左孩子(也不可能有右孩子)
2. 当 2 p + 1 ⩽ n 2p+1\\leqslant n 2p+1⩽n,结点p有右孩子(也必有左孩子),否则没有右孩子
7. 完全二叉树的各行首结点编号
* 第 i i i行的首个元素的编号是 2 i − 1 2\^{i-1} 2i−1 ( 2 i − 1 2\^{i-1} 2i−1也是第 i i i行元素的最大数量)
* 由于前 i i i行的结点数为 2 i − 1 2\^i-1 2i−1
* 则前 i − 1 i-1 i−1行结点数为 2 i − 1 − 1 2\^{i-1}-1 2i−1−1
* 因此,第 i i i行的第一个元素结点为 2 i − 1 − 1 + 1 = 2 i − 1 2\^{i-1}-1+1=2\^{i-1} 2i−1−1+1=2i−1
* 完全 m m m叉树的第 i i i行首结点编号: 1 m − 1 ( m i − 1 − 1 ) + 1 \\frac{1}{m-1}(m\^{i-1}-1)+1 m−11(mi−1−1)+1
8. 完全二叉树最后一个**分支结点** 编号 ⌊ n 2 ⌋ \\lfloor\\frac{n}{2}\\rfloor ⌊2n⌋
9. 结点 i i i 所在层次(深度)为 ⌊ log 2 i ⌋ + 1 \\lfloor \\log_2 i \\rfloor + 1 ⌊log2i⌋+1或 ⌈ log 2 ( i + 1 ) ⌉ \\lceil \\log_2 (i + 1) \\rceil ⌈log2(i+1)⌉
* 推导过程和具有 n n n个结点的完全二叉树的高度一样
10. 具有 n n n 个 ( n \> 0 n \> 0 n\>0) 结点的完全二叉树的高度为 ⌈ log 2 ( n + 1 ) ⌉ \\lceil \\log_2 (n + 1) \\rceil ⌈log2(n+1)⌉ 或 ⌊ log 2 n ⌋ + 1 \\lfloor \\log_2 n \\rfloor + 1 ⌊log2n⌋+1
设高度为 h h h,根据二叉树的性质
2 h − 1 − 1 \< n ≤ 2 h − 1 2\^{h-1} - 1 \< n \\leq 2\^h - 1 2h−1−1\