树的基础概念与性质

树

定义

本质是递归——一棵树 = 一个根 + 多棵互不相交的子树。

相关概念

术语 含义
度(结点的度) 该结点拥有的子树个数
叶结点 度 = 0 的结点
分支结点 度 ≠ 0 的结点
树的度 所有结点度的最大值
前驱 / 父结点 结点的直接前驱(除根外,每个结点有且仅有一个前驱)
后继 / 孩子 结点的直接后继(可以有 0 或多个)
兄弟 同一个父结点的孩子之间互为兄弟
祖先 / 子孙 父结点、爷结点…;孩子、孙、重孙…
层次 根为第 1 层,根的孩子为第 2 层,依次类推
深度(高度) 所有结点层次的最大值
森林 m (m >= 0) 棵互不相交的树的集合

树的 3 条性质

  1. 除根结点外,每个结点有且仅有一个父结点。
  2. n 个结点的树有且仅有 n - 1 条边。
  3. 任意两个结点之间有且仅有一条简单路径(无自环、无重边)。

二叉树

定义

每个结点最多两个子树(子树有左右之分,分别叫左孩子 / 右孩子、左子树 / 右子树)。

4 种遍历

由先序 + 中序或中序 + 后序可以唯一确定一棵二叉树。先序 + 后序不行。

满二叉树 vs 完全二叉树

完全二叉树的特征:叶结点只可能出现在最下面两层。


二叉树的 6 条性质

下面 k = 树深度(根为第 1 层),n = 结点总数,n0 / n1 / n2 = 度为 0 / 1 / 2 的结点数,i = 结点编号。

性质 1

二叉树第 i 层最多 2^(i-1) 个结点(i >= 1)。

证明:归纳。


性质 2

深度为 k 的二叉树最多 2^k - 1 个结点(k >= 1)。

证明:每层取性质 1 的上界相加:

1 + 2 + 4 + ... + 2^(k-1) = 2^k - 1

性质 3

对任意二叉树,叶结点数 n0 = 度为 2 的结点数 n2 + 1,即 n0 = n2 + 1。

证明:

于是 n - 1 = n1 + 2 * n2,即

n = n1 + 2 * n2 + 1    ……(式 2)

(式 1)-(式 2):

n0 + n1 + n2 - (n1 + 2*n2 + 1) = 0
=>  n0 = n2 + 1

性质 4

n 个结点的完全二叉树深度 = floor(log2(n)) + 1。

证明:设深度为 k。按完全二叉树的定义:

联立:2^(k-1) - 1 < n <= 2^k - 1,加上 1 后等价于:

2^(k-1) <= n < 2^k

两边取 log2:k - 1 <= log2(n) < k。

k 是整数,所以 k = floor(log2(n)) + 1。


性质 5

n 个结点的二叉树,深度至少为 log2(n + 1)(即 floor(log2(n)) + 1,由 ceiling(log2(n+1)) = floor(log2(n)) + 1)。

证明:性质 2 的逆命题。

性质 2 给出上界:深度 = k ⇒ n <= 2^k - 1 ⇒ 2^k >= n + 1 ⇒ k >= log2(n + 1)。

深度是整数,所以 深度 >= ceiling(log2(n + 1)),而 ceiling(log2(n + 1)) = floor(log2(n)) + 1。


性质 6

n 个结点的完全二叉树,任一编号为 i 的结点:

  1. 父结点:若 i = 1 则为根,无父结点;否则父结点编号为 i / 2(整除)。
  2. 左孩子:若 2 * i > n 则无左孩子;否则左孩子编号为 2 * i。
  3. 右孩子:若 2 * i + 1 > n 则无右孩子;否则右孩子编号为 2 * i + 1。

证明:完全二叉树的编号规则是"自上而下、从左到右"。


速查公式表

量 公式
第 i 层最多结点数 2^(i-1)
深度 k 最多结点数 2^k - 1
n 结点完全二叉树深度 floor(log2(n)) + 1
叶结点数 vs 度 2 结点数 n0 = n2 + 1
父 / 左 / 右孩子编号 i/2,2i,2i+1(越界则不存在)