二叉树
二叉树是一种树形结构,一个节点最多有两个子节点,没有子节点的节点为叶节点,我们设二叉树的节点数为n。
基本概念
边
节点和子节点的连线为边,这个概念是所有树形结构的概念。除了根节点,每个节点和其父节点都有一条连线,所以树的边的个数为n-1。
高度
节点到其叶节点的最长简单路径中边的个数是节点的高度,树的高度为根节点的高度。
简单路径:除了起点和终点的节点外,路径中所有的节点都不重复。起点和终点重复的节点称为回路(或环)。
深度
深度和高度相反,是节点到根节点的简单路径中边的个数。
二叉树第一层的深度为0,第二层为1,依次递增。二叉树每层的层数和深度相同。
索引
这里我们将根节点的索引定为1,从上往下,从左往右,依次递增,最后一个节点的索引为n。在大多数编程语言中,数组索引的开始为0,这里要注意下。
特性
设二叉树中有0个子节点的节点的个数为n0,有1个子节点的节点的个数为n1,有两个子节点的节点的个数为n2,则:
n
0
=
n
2
+
1
n_0=n_2+1
n0=n2+1
证明:
n
=
n
0
+
n
1
+
n
2
二叉树的边数为
n
−
1
,
同时
n
2
的节点有
2
条边,
n
1
的节点有
1
条边,所以
n
−
1
=
2
∗
n
2
+
n
1
2
∗
n
2
+
n
1
+
1
=
n
0
+
n
1
+
n
2
n
2
+
1
=
n
0
n=n_0+n_1+n_2 \\ 二叉树的边数为n-1,同时n_2的节点有2条边,n_1的节点有1条边,所以\\ n-1=2*n_2+n_1 \\ 2*n_2+n_1+1=n_0+n_1+n_2 \\ n_2+1=n_0
n=n0+n1+n2二叉树的边数为n−1,同时n2的节点有2条边,n1的节点有1条边,所以n−1=2∗n2+n12∗n2+n1+1=n0+n1+n2n2+1=n0
还有其他特性放在下面的满二叉树和完全二叉树。
满二叉树
除了最后一层外,其他每层的所有节点都有两个子节点。
设满二叉树的高度为h,层数为 i ( i = 0 , 1 , 2 , . . . , h ) i(i=0,1,2,...,h) i(i=0,1,2,...,h),则
-
节点的总数为 2 h + 1 − 1 2^{h+1}-1 2h+1−1;
-
第i层的节点数为 2 i 2^{i} 2i;
-
第i层第一个节点的索引为 2 i 2^i 2i;
由1,2可知:
2
h
+
1
−
1
=
2
0
+
2
1
+
2
2
+
.
.
.
+
2
h
2
h
+
1
=
2
0
+
2
1
+
2
2
+
.
.
.
+
2
h
+
1
2^{h+1}-1=2^0+2^1+2^2+...+2^h \\ 2^{h+1}=2^0+2^1+2^2+...+2^h+1
2h+1−1=20+21+22+...+2h2h+1=20+21+22+...+2h+1
完全二叉树
除了最后一层外,每层都是满的,即每层的节点数为 2 i 2^{i} 2i,且最后一层的节点都集中在左侧。若高度为h的完全二叉树的节点数为n,则它和同样高度为h的满二叉树的前n个节点可以一一对应。满二叉树是一种特殊的完全二叉树。
节点数和层数
若完全二叉树的高度为h,当最后一层有1个节点或 2 h 2^h 2h 个节点时,是完全二叉树的最小和最大值。
根据i层的第一个节点的索引为
2
i
2^i
2i 可知:
2
h
≤
n
≤
2
h
+
1
−
1
2
h
≤
n
<
2
h
+
1
h
≤
lg
n
<
h
+
1
h
=
⌊
lg
n
⌋
或者
2
h
+
1
≤
n
+
1
≤
2
h
+
1
2
h
<
n
+
1
≤
2
h
+
1
h
<
lg
(
n
+
1
)
≤
h
+
1
h
=
⌈
l
g
(
n
+
1
)
⌉
−
1
2^h \leq n \leq 2^{h+1}-1 \\ 2^h \leq n < 2^{h+1} \\ h \leq \lg n < h+1 \\ h = \lfloor \lg n \rfloor \\ 或者2^h+1 \leq n+1 \leq 2^{h+1} \\ 2^h < n+1 \leq 2^{h+1} \\ h < \lg (n+1) \leq h+1 \\ h = \lceil lg (n+1) \rceil - 1
2h≤n≤2h+1−12h≤n<2h+1h≤lgn<h+1h=⌊lgn⌋或者2h+1≤n+1≤2h+12h<n+1≤2h+1h<lg(n+1)≤h+1h=⌈lg(n+1)⌉−1
节点数和层数的关系为
h
=
⌊
lg
n
⌋
h = \lfloor \lg n \rfloor
h=⌊lgn⌋或
h
=
⌈
l
g
(
n
+
1
)
⌉
−
1
h = \lceil lg (n+1) \rceil - 1
h=⌈lg(n+1)⌉−1
叶节点的开始索引
可以容易看出,在完全二叉树中,只有一个子节点的节点只有0个或1个,即
0
≤
n
1
≤
1
0 \leq n_1 \leq 1
0≤n1≤1。将所有节点从上到下,从左到右的排序,顺序为两个子节点的节点,1个子节点的节点,0个子节点的节点,所以叶节点的开始索引为
i
=
n
2
+
n
1
+
1
=
n
−
n
0
+
1
i=n_2+n_1+1=n-n_0+1
i=n2+n1+1=n−n0+1。
n
=
n
0
+
n
1
+
n
2
n
0
=
n
2
+
1
0
≤
n
1
≤
1
可得
n
0
=
⌈
n
2
⌉
i
=
n
−
n
0
+
1
=
n
−
⌈
n
2
⌉
+
1
i
=
⌊
n
2
⌋
+
1
n=n_0+n_1+n_2 \\ n_0=n_2+1 \\ 0 \leq n_1 \leq 1 \\ 可得n_0 = \lceil \frac{n}{2} \rceil \\ i=n-n_0+1=n-\lceil \frac{n}{2} \rceil+1 \\ i=\lfloor \frac{n}{2} \rfloor+1
n=n0+n1+n2n0=n2+10≤n1≤1可得n0=⌈2n⌉i=n−n0+1=n−⌈2n⌉+1i=⌊2n⌋+1
所以叶节点开始的索引为
⌊
n
2
⌋
+
1
\lfloor \frac{n}{2} \rfloor+1
⌊2n⌋+1或者
⌈
n
+
1
2
⌉
\lceil \frac{n+1}{2} \rceil
⌈2n+1⌉