二叉树

二叉树(Binary Tree)是计算机科学中一种基础且极其重要的数据结构。它是 $n$ 个结点的有限集合,其特点是每个结点最多只有两个子结点,通常被称为“左孩子”和“右孩子”。


1. 二叉树的基本概念

在二叉树中,不存在度大于 2 的结点。二叉树的子树有左右之分,次序不能任意颠倒。

  • 根结点(Root): 树的最顶端结点。
  • 叶子结点(Leaf): 没有子结点的结点。
  • 深度(Depth): 从根结点到该结点的最长路径上的结点数。
  • 高度(Height): 从该结点到叶子结点的最长路径上的结点数。
  • 度(Degree): 结点拥有的子树数量,二叉树中结点的度最大为 2。

2. 特殊的二叉树类型

了解特殊的二叉树有助于我们在特定的场景下选择最优算法:

  1. 满二叉树 (Full Binary Tree): 除了叶子结点外,每个结点都有两个子结点,且所有叶子结点都在同一层。
  2. 完全二叉树 (Complete Binary Tree): 除了最后一层外,其他各层的结点数都达到最大,且最后一层的结点都集中在左侧。
  3. 二叉搜索树 (Binary Search Tree, BST): 左子树所有结点的值均小于根结点,右子树所有结点的值均大于根结点。这种结构极大地提高了搜索效率。
  4. 平衡二叉树 (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+树: 虽然不是二叉树,但是由二叉树思想演变而来,广泛用于数据库索引。
posted @ 2025-12-20 20:49  belief73  阅读(1)  评论(0)    收藏  举报