二叉树
二叉树(Binary Tree)是计算机科学中一种基础且极其重要的数据结构。它是 $n$ 个结点的有限集合,其特点是每个结点最多只有两个子结点,通常被称为“左孩子”和“右孩子”。
1. 二叉树的基本概念
在二叉树中,不存在度大于 2 的结点。二叉树的子树有左右之分,次序不能任意颠倒。
- 根结点(Root): 树的最顶端结点。
- 叶子结点(Leaf): 没有子结点的结点。
- 深度(Depth): 从根结点到该结点的最长路径上的结点数。
- 高度(Height): 从该结点到叶子结点的最长路径上的结点数。
- 度(Degree): 结点拥有的子树数量,二叉树中结点的度最大为 2。
2. 特殊的二叉树类型
了解特殊的二叉树有助于我们在特定的场景下选择最优算法:
- 满二叉树 (Full Binary Tree): 除了叶子结点外,每个结点都有两个子结点,且所有叶子结点都在同一层。
- 完全二叉树 (Complete Binary Tree): 除了最后一层外,其他各层的结点数都达到最大,且最后一层的结点都集中在左侧。
- 二叉搜索树 (Binary Search Tree, BST): 左子树所有结点的值均小于根结点,右子树所有结点的值均大于根结点。这种结构极大地提高了搜索效率。
- 平衡二叉树 (AVL Tree): 它是一棵二叉搜索树,且任何结点的两个子树的高度差(平衡因子)不超过 1。
[Image comparing full binary tree, complete binary tree, and binary search tree]
3. 二叉树的存储结构
顺序存储(数组)
通常用于完全二叉树。对于编号为 $i$ 的结点:
- 左孩子下标为 $2i$
- 右孩子下标为 $2i + 1$
- 父结点下标为 $i/2$
链式存储(指针)
这是最常用的方式。每个结点包含三个部分:数据域、左孩子指针、右孩子指针。
Python
class TreeNode:
def __init__(self, value):
self.val = value
self.left = None
self.right = None
4. 二叉树的遍历方式(核心)
遍历是指按某种次序访问树中所有结点,使每个结点被访问且仅被访问一次。
深度优先遍历 (DFS)
- 前序遍历 (Pre-order): 根 $\rightarrow$ 左 $\rightarrow$ 右
- 中序遍历 (In-order): 左 $\rightarrow$ 根 $\rightarrow$ 右(对 BST 进行中序遍历可以得到升序序列)
- 后序遍历 (Post-order): 左 $\rightarrow$ 右 $\rightarrow$ 根
广度优先遍历 (BFS)
- 层序遍历 (Level-order): 按照从上到下、从左到右的顺序逐层访问。通常利用队列 (Queue) 实现。
5. 二叉树的常用性质
在处理算法题或计算复杂度时,以下性质非常有用:
- 在二叉树的第 $i$ 层上最多有 $2^{i-1}$ 个结点 ($i \ge 1$)。
- 高度为 $h$ 的二叉树最多有 $2^h - 1$ 个结点。
- 度数关系: 若叶子结点数为 $n_0$,度为 2 的结点数为 $n_2$,则必定满足 $n_0 = n_2 + 1$。
- 具有 $n$ 个结点的完全二叉树的深度为 $\lfloor \log_2 n \rfloor + 1$。
6. 二叉树的应用场景
- 表达式树: 用于编译器处理算术表达式。
- 哈夫曼树 (Huffman Tree): 用于数据压缩算法。
- 堆 (Heap): 优先队列的核心实现,本质是完全二叉树。
- B-树/B+树: 虽然不是二叉树,但是由二叉树思想演变而来,广泛用于数据库索引。
浙公网安备 33010602011771号