1. 项目概述
今天想和大家分享我在LeetCode上刷题的第53天记录,重点整理了面试中经常出现的二叉树相关经典题目。作为程序员技术面试的"必修课",二叉树问题几乎出现在每家公司的考察范围内。我精选了150道高频题目,通过系统性的分类和解题思路整理,帮助大家快速掌握这类题目的解题模式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心题目分类与解题思路
2.1 二叉树遍历问题
二叉树的遍历是面试中最基础也是最重要的考点。常见的遍历方式包括:
- 前序遍历(根-左-右)
- 中序遍历(左-根-右)
- 后序遍历(左-右-根)
- 层序遍历(广度优先)
对于递归解法,代码模板非常固定:
python复制def traverse(root):
if not root:
return
# 前序位置
traverse(root.left)
# 中序位置
traverse(root.right)
# 后序位置
迭代解法通常需要借助栈来实现:
python复制def preorderTraversal(root):
stack = []
res = []
while root or stack:
while root:
res.append(root.val)
stack.append(root)
root = root.left
root = stack.pop()
root = root.right
return res
2.2 二叉树深度相关问题
计算二叉树的最大深度、最小深度是常见问题。最大深度的递归解法:
python复制def maxDepth(root):
if not root:
return 0
return max(maxDepth(root.left), maxDepth(root.right)) + 1
最小深度需要注意只有单子树的情况:
python复制def minDepth(root):
if not root:
return 0
if not root.left:
return minDepth(root.right) + 1
if not root.right:
return minDepth(root.left) + 1
return min(minDepth(root.left), minDepth(root.right)) + 1
2.3 二叉树路径问题
路径总和类问题通常需要记录路径信息:
python复制def hasPathSum(root, target):
if not root:
return False
if not root.left and not root.right:
return root.val == target
return hasPathSum(root.left, target-root.val) or hasPathSum(root.right, target-root.val)
3. 高频题目精讲
3.1 二叉树的层序遍历(LeetCode 102)
这道题要求按层输出节点值,是典型的BFS应用:
python复制def levelOrder(root):
if not root:
return []
queue = [root]
res = []
while queue:
level = []
for _ in range(len(queue)):
node = queue.pop(0)
level.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(level)
return res
3.2 二叉树的最大深度(LeetCode 104)
递归解法简洁明了:
python复制def maxDepth(root):
if not root:
return 0
return max(maxDepth(root.left), maxDepth(root.right)) + 1
3.3 对称二叉树(LeetCode 101)
判断二叉树是否对称:
python复制def isSymmetric(root):
def helper(left, right):
if not left and not right:
return True
if not left or not right:
return False
return left.val == right.val and helper(left.left, right.right) and helper(left.right, right.left)
return helper(root.left, root.right) if root else True
4. 解题技巧与注意事项
4.1 递归与迭代的选择
递归代码简洁但可能有栈溢出风险,迭代更可控但代码复杂。根据题目要求选择:
- 简单问题:优先考虑递归
- 深度较大:使用迭代
- 需要特定顺序:迭代更灵活
4.2 边界条件处理
二叉树问题常见的边界条件:
- 空树情况(root is None)
- 只有左子树或右子树
- 所有节点值相同的情况
- 单节点树
4.3 时间复杂度分析
大多数二叉树问题的时间复杂度为O(n),n为节点数。空间复杂度:
- 递归:O(h),h为树高
- 迭代:O(n)最坏情况
5. 常见错误与调试技巧
5.1 指针丢失问题
在修改指针时要特别注意不要丢失引用:
python复制# 错误示例
node = node.left # 可能丢失原node的右子树引用
# 正确做法
left = node.left
right = node.right
# 再进行处理
5.2 递归终止条件
递归必须要有终止条件,否则会导致无限递归:
python复制def traverse(root):
if not root: # 必须的终止条件
return
# 递归处理
5.3 测试用例设计
好的测试用例应该包含:
- 空树
- 单节点树
- 完全二叉树
- 只有左子树/右子树的树
- 普通二叉树
6. 进阶题目推荐
- 二叉树的序列化与反序列化(LeetCode 297)
- 二叉树的最近公共祖先(LeetCode 236)
- 二叉树中的最大路径和(LeetCode 124)
- 验证二叉搜索树(LeetCode 98)
- 根据前序和中序遍历构造二叉树(LeetCode 105)
7. 刷题建议
- 先掌握基础遍历方法
- 理解递归的思想
- 从简单题目开始,逐步提升难度
- 每道题至少做两遍
- 整理错题本,记录易错点
- 参加周赛锻炼实战能力
二叉树问题的核心在于理解树的结构特性,掌握递归思想,并能够灵活运用各种遍历方法。通过系统性的练习,这类题目会成为面试中的得分点而非难点。
