二叉树
二叉树是一种树形结构,一个节点最多有两个子节点,没有子节点的节点为叶节点,我们设二叉树的节点数为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⌉