二叉树与红黑树核心知识点及面试重点
一、二叉树 (Binary Tree)
1. 基础概念
-
定义:每个节点最多有两个子节点(左子节点和右子节点)
-
术语:
-
根节点:最顶层的节点
-
叶子节点:没有子节点的节点
-
深度:从根到节点的路径长度
-
高度:从节点到最深叶子节点的路径长度
-
2. 常见类型
类型 | 特点 |
---|---|
满二叉树 | 所有非叶子节点都有两个子节点,且所有叶子在同一层 |
完全二叉树 | 除最后一层外,其他层必须填满,最后一层从左到右连续填充 |
二叉搜索树(BST) | 左子树所有节点值 < 根节点值 < 右子树所有节点值(中序遍历有序) |
平衡二叉树 | 任意节点的左右子树高度差不超过1(如AVL树) |
3. 遍历方式(重点!)
-
前序遍历:根 → 左 → 右
java
void preOrder(TreeNode root) { if (root == null) return; System.out.print(root.val + " "); preOrder(root.left); preOrder(root.right); }
中序遍历:左 → 根 → 右(BST中序遍历结果为升序)
-
后序遍历:左 → 右 → 根
-
层序遍历:按层级从上到下、从左到右(BFS实现)
4. 面试高频问题
-
二叉树的最大深度
java
int maxDepth(TreeNode root) { return root == null ? 0 : 1 + Math.max(maxDepth(root.left), maxDepth(root.right)); }
判断是否为平衡二叉树
(需同时检查高度差和左右子树是否平衡) -
二叉树的最近公共祖先(LCA)
(分治思想,递归查找左右子树)
二、红黑树 (Red-Black Tree)
1. 核心性质
红黑树是自平衡的二叉搜索树,满足以下规则:
-
节点颜色:每个节点非红即黑
-
根节点:必须为黑色
-
叶子节点(NIL):虚拟的黑色空节点
-
红色节点规则:红色节点的子节点必须为黑色(不能有连续红节点)
-
黑高平衡:从任一节点到其叶子节点的所有路径包含相同数量的黑色节点
2. 平衡操作(关键面试点)
-
左旋/右旋:调整树结构保持平衡
java
// 伪代码示例:左旋 void leftRotate(Node x) { Node y = x.right; x.right = y.left; if (y.left != nil) y.left.parent = x; y.parent = x.parent; // ... 更新父节点指向 }
颜色翻转:插入/删除后通过变色和旋转恢复平衡
3. 与AVL树的对比
特性 | 红黑树 | AVL树 |
---|---|---|
平衡标准 | 黑高平衡(宽松) | 严格高度平衡(左右子树高度差≤1) |
插入/删除 | 最多2次旋转 | 可能需O(log n)次旋转 |
查询效率 | O(log n),但常数项比AVL大 | 更快的查询(严格平衡) |
应用场景 | Java HashMap, TreeMap | 数据库索引等高频查询场景 |
4. 时间复杂度
操作 | 时间复杂度 | 原因 |
---|---|---|
插入 | O(log n) | 自平衡调整 |
删除 | O(log n) | 最多3次旋转 |
查找 | O(log n) | 近似平衡的二叉搜索树 |
5. 面试高频问题
-
红黑树如何保证平衡?
(结合插入/删除的变色和旋转规则回答) -
为什么Java的HashMap链表长度超过8转红黑树?
(哈希冲突时,红黑树将查找时间从O(n)优化到O(log n)) -
手写红黑树的插入逻辑
(需掌握case分析,如叔节点为红/黑时的不同处理)
三、实战代码片段
红黑树节点定义
java
class RBNode<K extends Comparable<K>, V> {
K key;
V value;
RBNode<K,V> left, right, parent;
boolean color; // RED or BLACK
}
检查红黑树有效性
java
boolean isRBTreeValid(RBNode root) {
if (root == null) return true;
// 规则2:根节点必须为黑
if (root.color != BLACK) return false;
// 检查每条路径的黑高相同
int blackHeight = getBlackHeight(root);
return checkRedBlackRules(root, blackHeight, 0);
}
四、常见面试题
-
二叉树
-
如何序列化/反序列化二叉树?
-
如何实现二叉树的层次遍历?
-
判断两棵二叉树是否相同?
-
-
红黑树
-
为什么红黑树的效率比AVL树更适合Java集合类?
-
红黑树的插入删除过程中,有哪些情况需要处理?
-
如何证明红黑树的高度是O(log n)?
-
掌握这些核心知识点后,你就能在面试中游刃有余地应对树结构相关问题!红黑树的实现细节较复杂,建议结合可视化工具(如Red-Black Tree Visualizer)加深理解。