在刷二叉树相关的算法题时,我们经常会遇到各种不同类型的二叉树,如二叉搜索树、完全二叉树、平衡二叉树等。虽然在刷题时有一定的理解,但有时候概念还是容易混淆。为了更好地梳理这些概念,我整理了如下内容,供大家复习参考。
1. 基础概念
- 二叉树(Binary Tree):每个节点最多有两个子节点(左、右)。
- 树的高度(Height):根节点到最远叶子节点的最长路径的节点数或边数(注意:两种方法结果相差1)。
- 节点的深度(Depth):根节点到当前节点的路径节点数或边数。
- 叶子节点(Leaf Node):没有子节点的节点。
2. 常见二叉树分类
类型 | 定义 |
---|---|
满二叉树(Full Binary Tree) | 每个节点要么有 0 个子节点(叶子),要么有 2 个子节点。 |
完全二叉树(Complete Binary Tree) | 底层必须从左到右连续填充,次底层必须满。 |
平衡二叉树(Balanced Binary Tree) | 所有左右子树高度差不能超过一定值(如 AVL ≤1)。 |
二叉搜索树(BST, Binary Search Tree) | 左子树所有值 < 当前节点值 < 右子树所有值。 |
平衡二叉搜索树(AVL/红黑树) | BST + 平衡二叉树的结合,保证查找/插入/删除 O(logN)。 |
堆(Heap) | 完全二叉树 + 父子节点有序。 |
普通二叉树
- 每个节点最多有两个子节点。
满二叉树(Full Binary Tree)
- 每个节点要么有 0 个子节点,要么正好有 2 个子节点。
- 例如:
1 / \ 2 3 / \ / \ 4 5 6 7
完全二叉树(Complete Binary Tree)
- 底层节点必须从左到右连续填充,中间不能有空隙。
- 除底层外,每一层必须是满的。
- 例如:
1 / \ 2 3 / \ / 4 5 6
注意:完全二叉树是特殊的满二叉树,但不要求所有层都满。
平衡二叉树(Balanced Binary Tree)
- 每个节点的左右子树高度差不超过 1。
- 不要求从左到右连续填充,只要满足高度平衡即可。
- 例如:
3 / \ 2 5 / / 1 4
平衡二叉树主要用来保证树的高度较低,从而提高查找、插入和删除的效率。
二叉搜索树(BST, Binary Search Tree)
- 对于任意节点:
- 左子树所有节点 < 当前节点
- 右子树所有节点 > 当前节点
- 中序遍历结果是一个递增序列。
- 例如:
5 / \ 3 7 / \ / 2 4 6
平衡二叉搜索树(Balanced BST)
- BST + 平衡二叉树的结合。
- 既满足二叉搜索树的顺序性质,又保证左右子树高度差不超过 1。
- 例如:AVL 树、红黑树。
堆(Heap)
- 完全二叉树,且满足堆序性:
- 最大堆(Max Heap):父节点值 ≥ 子节点值。
- 最小堆(Min Heap):父节点值 ≤ 子节点值。
- 堆 ≠ 二叉搜索树,因为堆不能保证左子树小于当前节点,右子树大于当前节点。
3. 详细对比
❶ 满二叉树 vs. 完全二叉树
类型 | 是否要求每个节点有 2 个子节点 | 底层是否要求从左到右连续 | 是否必须填满次底层 |
---|---|---|---|
满二叉树 | ✅ 是 | ✅ 是(叶子在同一层) | ✅ 是 |
完全二叉树 | ❌ 否 | ✅ 是 | ✅ 是 |
❷ 平衡二叉树 vs. 完全二叉树
类型 | 是否要求左右子树高度相近 | 是否要求底层从左到右连续 | 是否有平衡条件 |
---|---|---|---|
完全二叉树 | ❌ 否 | ✅ 是 | ❌ 否 |
平衡二叉树 | ✅ 是 | ❌ 否 | ✅ 是(如 AVL ≤1) |
❸ 二叉搜索树(BST) vs. 平衡二叉搜索树
类型 | 是否保证左 < 根 < 右 | 是否保证平衡 | 是否防止退化 |
---|---|---|---|
BST | ✅ 是 | ❌ 否 | ❌ 否(可能退化成链表) |
平衡 BST | ✅ 是 | ✅ 是 | ✅ 是 |
4. 常见疑问解答
Q1: 平衡二叉搜索树是二叉搜索树和平衡二叉树的结合吗?
是的,平衡二叉搜索树同时满足二叉搜索树的顺序性和平衡二叉树的高度限制。
Q2: 平衡二叉树和完全二叉树的区别?
- 完全二叉树要求底层节点必须从左到右连续填充。
- 平衡二叉树只要求左右子树高度差不超过 1,并不要求底层节点是连续的。
Q3: 堆是平衡二叉搜索树吗?
不是,堆只要求是完全二叉树,并且满足父子节点的堆序性,而二叉搜索树要求左子树 < 当前节点 < 右子树。