【数据结构】二叉树

二叉树

二叉树是一种树形结构,一个节点最多有两个子节点,没有子节点的节点为叶节点,我们设二叉树的节点数为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二叉树的边数为n1,同时n2的节点有2条边,n1的节点有1条边,所以n1=2n2+n12n2+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),则

  1. 节点的总数为 2 h + 1 − 1 2^{h+1}-1 2h+11

  2. 第i层的节点数为 2 i 2^{i} 2i​;

  3. 第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+11=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 2hn2h+112hn<2h+1hlgn<h+1h=lgn或者2h+1n+12h+12h<n+12h+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 0n11。将所有节点从上到下,从左到右的排序,顺序为两个子节点的节点,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=nn0+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+10n11可得n0=2ni=nn0+1=n2n+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

相关推荐

  1. 数据结构-

    2024-04-02 10:20:02       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 10:20:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 10:20:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 10:20:02       82 阅读
  4. Python语言-面向对象

    2024-04-02 10:20:02       91 阅读

热门阅读

  1. Unity 读写Excel打包后无法运行可能的解决方案

    2024-04-02 10:20:02       36 阅读
  2. ubuntu 20.04 SD 卡分区类型 msdos 改为 GPT 的方法

    2024-04-02 10:20:02       39 阅读
  3. LeetCode热题Hot100 - 最长回文子串

    2024-04-02 10:20:02       41 阅读
  4. 探索信创之路:为何坚持自主创新

    2024-04-02 10:20:02       41 阅读
  5. C++ list

    C++ list

    2024-04-02 10:20:02      33 阅读
  6. HashMap 和 Hashtable 有什么区别?

    2024-04-02 10:20:02       42 阅读
  7. OpenEuler/Centos制作离线软件源

    2024-04-02 10:20:02       43 阅读
  8. File类的解释与说明

    2024-04-02 10:20:02       38 阅读
  9. linux清空文件内容

    2024-04-02 10:20:02       37 阅读