一、核心定义
二叉树是n(n≥0)个节点的有限集合,每个节点最多有两个子节点,分别称为左子树 和右子树,且子树有明确的左右顺序(不可交换)。
- 特殊情况:n=0时为空二叉树;n=1时为单节点树。
资料:https://pan.quark.cn/s/43d906ddfa1b、https://pan.quark.cn/s/90ad8fba8347、https://pan.quark.cn/s/d9d72152d3cf
二、关键特性
- 层数与节点数 :
- 第i层最多有2ⁱ⁻¹个节点(i≥1);
- 深度为k的二叉树最多有2ᵏ - 1个节点(满二叉树)。
- 叶子节点公式:对于任意二叉树,度为0的节点数(叶子)= 度为2的节点数 + 1。
- 完全二叉树:除最后一层外,每层节点数均满,最后一层节点从左到右连续排列(常用于堆排序)。
三、常见分类
| 类型 | 特点 | 应用场景 |
|---|---|---|
| 满二叉树 | 所有层节点数均为最大值(2ⁱ⁻¹) | 理论研究、完全二叉树特例 |
| 完全二叉树 | 按层序编号与满二叉树一致 | 堆(大顶堆/小顶堆)、优先队列 |
| 二叉搜索树(BST) | 左子树所有节点值<根节点值<右子树所有节点值 | 快速查找、插入(平均O(logn)) |
| 平衡二叉树(AVL) | 左右子树深度差≤1 | 解决BST斜树退化问题 |
| 红黑树 | 自平衡BST,节点分红/黑,满足5条规则 | TreeMap、HashMap(JDK8) |
四、核心操作(Python示例)
1. 二叉树节点定义
python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val # 节点值
self.left = left # 左子节点
self.right = right # 右子节点
2. 遍历(高频考点)
(1)前序遍历(根→左→右)
python
# 递归版
def preorderTraversal(root):
res = []
def dfs(node):
if node:
res.append(node.val)
dfs(node.left)
dfs(node.right)
dfs(root)
return res
# 迭代版(栈实现)
def preorderTraversal(root):
res, stack = [], [root]
while stack:
node = stack.pop()
if node:
res.append(node.val)
stack.append(node.right) # 右先入栈(栈先进后出)
stack.append(node.left)
return res
(2)中序遍历(左→根→右)
python
# 递归版
def inorderTraversal(root):
res = []
def dfs(node):
if node:
dfs(node.left)
res.append(node.val)
dfs(node.right)
dfs(root)
return res
# 迭代版(栈实现)
def inorderTraversal(root):
res, stack = [], []
while root or stack:
while root:
stack.append(root)
root = root.left # 左子树遍历到底
root = stack.pop()
res.append(root.val)
root = root.right # 处理右子树
return res
(3)后序遍历(左→右→根)
python
# 递归版
def postorderTraversal(root):
res = []
def dfs(node):
if node:
dfs(node.left)
dfs(node.right)
res.append(node.val)
dfs(root)
return res
# 迭代版(栈+标记)
def postorderTraversal(root):
res, stack = [], [(root, False)]
while stack:
node, visited = stack.pop()
if node:
if visited:
res.append(node.val)
else:
stack.append((node, True))
stack.append((node.right, False))
stack.append((node.left, False))
return res
(4)层序遍历(按层输出,BFS)
python
from collections import deque
def levelOrder(root):
res = []
if not root:
return res
queue = deque([root])
while queue:
level_size = len(queue) # 当前层节点数
level_res = []
for _ in range(level_size):
node = queue.popleft()
level_res.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(level_res)
return res
3. 高频面试题实现
(1)求二叉树的深度
python
def maxDepth(root):
if not root:
return 0
left_depth = maxDepth(root.left)
right_depth = maxDepth(root.right)
return max(left_depth, right_depth) + 1 # 根节点占1层
(2)判断是否为平衡二叉树
python
def isBalanced(root):
def check_depth(node):
if not node:
return 0
left = check_depth(node.left)
if left == -1:
return -1 # 左子树不平衡
right = check_depth(node.right)
if right == -1:
return -1 # 右子树不平衡
# 左右深度差>1则不平衡
return max(left, right) + 1 if abs(left - right) <= 1 else -1
return check_depth(root) != -1
(3)二叉搜索树(BST)验证
python
def isValidBST(root):
def dfs(node, min_val, max_val):
if not node:
return True
# BST规则:左<根<右
if not (min_val < node.val < max_val):
return False
# 左子树最大值为当前节点值,右子树最小值为当前节点值
return dfs(node.left, min_val, node.val) and dfs(node.right, node.val, max_val)
return dfs(root, float('-inf'), float('inf'))
五、应用场景
- 搜索与排序:BST、红黑树用于高效查找/插入/删除(如数据库索引);
- 层次化数据处理:目录结构、XML/HTML解析(DOM树);
- 算法优化:二叉堆用于堆排序、优先队列(如任务调度);
- 路径问题:二叉树的最长路径、最近公共祖先(LCA)等面试高频场景。
六、关键注意点
- 递归是二叉树操作的核心思想,但需注意栈溢出(深度过大时用迭代);
- 二叉搜索树的中序遍历是升序序列(重要性质,用于验证和排序);
- 平衡二叉树(AVL/红黑树)解决了普通BST斜树退化(时间复杂度O(n))的问题,保证O(logn)效率。