Skip to content

Chapter 05 二叉树

1. 概念

  • 度数即有多少个孩子.
  • 层数从 0 开始.

1.1 满二叉树

如果一棵二叉树没有 1 度节点, 则是满二叉树.

1.2 完全二叉树

只有最下面一层没有填满.

最下面一层的结点集中分布在最左边, 连续的位置上.

特点:
- 叶结点只有可能在最下面两层出现
- 路径长度和是相同结点数目的二叉树中最小的

1.3 扩充二叉树

当二叉树节点出现空指针时,就增加一个特殊结点——空树叶

度为1的结点,在它下面增加1个空树叶

度为0的树叶,在它下面增加2个空树叶

扩充的二叉树是满二叉树,新增加空树叶(外部结点L)的个数等于原来二叉树结点个数(内部结点N)加1

这里的 L 和 N 指的是相对扩充后的二叉树而言的

证明: 利用 \(n_0=n_2+1\), 新增加的节点数为 \(2n_0+n_1=n_0+n_1+n_2+1\)

\(n_0=n_2+1\) 的证明:

\[n=n_0+n_1+n_2\]
\[n=1+2n_2+n_1\]

这里第一个计算方式显然, 第二个计算方式是利用计算孩子总数加上根节点得到. 两式相减即得.

2. 二叉树的主要性质




(分支结点是度数大于0的节点, 满二叉树度数要么是0, 要么是2)

3. 二叉树的周游

遍历(Traversal),也称“周游”
- 按照一定的次序(规律)系统地访问二叉树中的结点
- 每个结点都正好被访问(输出,修改节点信息等) 一次

二叉树的线性化
- 实质是把二叉树的结点放入一个线性序列的过程
- “非线性”->“线性”的过程

线性化方式,是对非线性结构的访问方式
- 深度优先:一棵一棵子树的纵深遍历
- 广度优先:一层一层的自左而右的逐层横向遍历

Warning

已知先序序列和中序序列可以唯一确定一棵二叉树, 已知后序序列和中序序列可以唯一确定一棵二叉树, 但是已知先序和后序序列不能唯一确定一棵二叉树. (先序和后序无法区分左右)

4. 非递归遍历二叉树

4.1 前序

4.2 中序


4.3 后序

5. 二叉树的存储结构

5.1 动态链式存储

各结点随机存储在内存空间,结点之间关系用指针表示。

除存储结点本身数据外,每个结点再设置两个指针字段left和right,分别指向左孩子和右孩子;

子女为空时指针为空指针

这种存储结构称为二叉链表表示法

三叉链表

除 left 和 right 指针外,每个结点再增加一个指向父节点的指针 parent,形成“三叉链表”

提供了“向上”访问的能力

5.2 静态数组存储(完全二叉树)

6. 二叉搜索树

二叉搜索树(BST),也称二叉排序树

  • 或者是一颗空树;
  • 或者是具有下列性质的二叉树:
    • 对于任何一个结点,设其值为K,则该结点的左子树(若不空)的任意一个结点的值都小于K;
    • 该结点的右子树(若不空)的任意一个结点的值都大于K;
    • 而且它的左右子树也分别为二叉搜索树

二叉搜索树的性质

  • 按照中序周游将各结点打印出来,将得到由小到大的排列
  • 树中结点的值唯一

7. 堆与优先队列

7.1 堆的性质

  • 堆中储存的数据局部有序(与BST树不同)
  • 结点与其子女值之间存在大小比较关系
  • 两种堆(最大、最小)
  • 兄弟之间没有限定大小关系
  • 堆不唯一
  • 是一棵可用数组表示的完全二叉树