1. 二叉树经典算法题实战解析
最近在整理LeetCode上关于二叉树的经典题目时,我发现编号1-10的这组题目(144、145、94、102、226、101、104、111、222)特别有代表性。这些题目涵盖了二叉树的前序、中序、后序遍历,层次遍历,以及对称性判断、深度计算、节点统计等核心操作。作为数据结构与算法的基础内容,掌握这些题目对提升编程思维和面试能力都大有裨益。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 题目分类与核心考点
2.1 遍历类题目
-
- 二叉树的前序遍历
-
- 二叉树的中序遍历
-
- 二叉树的后序遍历
-
- 二叉树的层次遍历
2.2 属性判断类题目
-
- 对称二叉树
-
- 二叉树的最大深度
-
- 二叉树的最小深度
-
- 完全二叉树的节点个数
2.3 变形操作类题目
-
- 翻转二叉树
3. 递归解法实现
3.1 前序遍历递归实现
python复制def preorderTraversal(root):
res = []
def helper(node):
if not node:
return
res.append(node.val)
helper(node.left)
helper(node.right)
helper(root)
return res
3.2 中序遍历递归实现
python复制def inorderTraversal(root):
res = []
def helper(node):
if not node:
return
helper(node.left)
res.append(node.val)
helper(node.right)
helper(root)
return res
3.3 后序遍历递归实现
python复制def postorderTraversal(root):
res = []
def helper(node):
if not node:
return
helper(node.left)
helper(node.right)
res.append(node.val)
helper(root)
return res
4. 迭代解法实现
4.1 前序遍历迭代实现
python复制def preorderTraversal(root):
if not root:
return []
stack, res = [root], []
while stack:
node = stack.pop()
res.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res
4.2 中序遍历迭代实现
python复制def inorderTraversal(root):
res, stack = [], []
curr = root
while curr or stack:
while curr:
stack.append(curr)
curr = curr.left
curr = stack.pop()
res.append(curr.val)
curr = curr.right
return res
4.3 后序遍历迭代实现
python复制def postorderTraversal(root):
if not root:
return []
stack, res = [root], []
while stack:
node = stack.pop()
res.append(node.val)
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return res[::-1]
5. 层次遍历实现
5.1 基本层次遍历
python复制def levelOrder(root):
if not root:
return []
queue, res = [root], []
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
5.2 之字形层次遍历
python复制def zigzagLevelOrder(root):
if not root:
return []
queue, res = [root], []
left_to_right = True
while queue:
level = []
for _ in range(len(queue)):
node = queue.pop(0)
if left_to_right:
level.append(node.val)
else:
level.insert(0, node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(level)
left_to_right = not left_to_right
return res
6. 二叉树属性判断
6.1 对称二叉树判断
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, root)
6.2 二叉树最大深度
python复制def maxDepth(root):
if not root:
return 0
return max(maxDepth(root.left), maxDepth(root.right)) + 1
6.3 二叉树最小深度
python复制def minDepth(root):
if not root:
return 0
if not root.left and not root.right:
return 1
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
7. 完全二叉树节点统计
7.1 普通二叉树节点统计
python复制def countNodes(root):
if not root:
return 0
return 1 + countNodes(root.left) + countNodes(root.right)
7.2 利用完全二叉树特性的优化解法
python复制def countNodes(root):
if not root:
return 0
left_depth = right_depth = 0
left = right = root
while left:
left_depth += 1
left = left.left
while right:
right_depth += 1
right = right.right
if left_depth == right_depth:
return (1 << left_depth) - 1
return 1 + countNodes(root.left) + countNodes(root.right)
8. 翻转二叉树实现
8.1 递归实现
python复制def invertTree(root):
if not root:
return None
root.left, root.right = invertTree(root.right), invertTree(root.left)
return root
8.2 迭代实现
python复制def invertTree(root):
if not root:
return None
queue = [root]
while queue:
node = queue.pop(0)
node.left, node.right = node.right, node.left
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return root
9. 常见问题与优化技巧
9.1 递归与迭代的选择
递归解法代码简洁但可能有栈溢出风险,适合深度不大的树;迭代解法更可控但代码稍复杂。在实际应用中,可以根据具体情况选择。
9.2 遍历顺序记忆技巧
前序:根左右;中序:左根右;后序:左右根。可以想象成"根"的位置代表访问时机。
9.3 层次遍历的变种
- 按层输出
- 之字形遍历
- 右视图/左视图
- 边界遍历
9.4 完全二叉树特性利用
完全二叉树的高度可以通过一直向左遍历快速计算,这个特性可以用来优化节点统计等操作。
10. 复杂度分析与比较
| 题目 | 解法 | 时间复杂度 | 空间复杂度 |
|---|---|---|---|
| 前序遍历 | 递归 | O(n) | O(h) |
| 前序遍历 | 迭代 | O(n) | O(n) |
| 中序遍历 | 递归 | O(n) | O(h) |
| 中序遍历 | 迭代 | O(n) | O(n) |
| 后序遍历 | 递归 | O(n) | O(h) |
| 后序遍历 | 迭代 | O(n) | O(n) |
| 层次遍历 | BFS | O(n) | O(n) |
| 对称判断 | 递归 | O(n) | O(h) |
| 最大深度 | 递归 | O(n) | O(h) |
| 节点统计 | 递归 | O(n) | O(h) |
11. 实际应用场景
二叉树相关算法在实际开发中有广泛应用:
- 文件系统目录结构遍历
- DOM树操作
- 数据库索引结构
- 游戏场景树
- 决策树算法
掌握这些基础算法不仅能帮助通过技术面试,更能提升解决实际问题的能力。建议在理解的基础上多练习,尝试不同的解法,并思考各种变种问题。
