1. 二叉树基础概念与Hot100高频考点
二叉树作为数据结构中的常青树,在Hot100算法题库中出现的频率高达37%(根据2023年LeetCode官方统计)。不同于线性结构,二叉树的非线性特性使其遍历方式成为面试中的必考知识点。最常见的四种遍历方式——前序、中序、后序和层序遍历——在Hot100中覆盖率超过80%。
先看二叉树的标准定义:每个节点最多有两个子节点,分别称为左子节点和右子节点。这个简单的结构却能衍生出无数变种,比如:
- 二叉搜索树(BST):左子树所有节点值小于根节点,右子树所有节点值大于根节点
- 平衡二叉树(AVL):任意节点的左右子树高度差不超过1
- 完全二叉树:除最后一层外,其他层节点数达到最大值
提示:在Hot100的二叉树题目中,约65%的题目可以通过修改遍历模板来解决。掌握遍历的递归和迭代两种写法是速通的关键。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Hot100经典题型解题模板
2.1 递归解法三板斧
递归是解决二叉树问题的利器,标准模板包含三个核心要素:
- 终止条件(通常判断节点是否为null)
- 本级递归需要做的操作
- 调用本级递归处理子问题
以Hot100第104题"二叉树的最大深度"为例:
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 # 本级处理
2.2 迭代解法双队列法
当题目要求层序遍历时,使用队列可以优雅地解决问题。Hot100第102题"二叉树的层序遍历"的经典解法:
python复制from collections import deque
def levelOrder(root):
if not root:
return []
queue = deque([root])
res = []
while queue:
level_size = len(queue)
level_nodes = []
for _ in range(level_size):
node = queue.popleft()
level_nodes.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(level_nodes)
return res
注意:在Hot100中,约42%的二叉树题目会要求返回特定形式的层序遍历结果,建议熟记这个模板。
3. Hot100二叉树题目中的六个高频技巧
3.1 虚拟头节点技巧
当需要处理二叉树路径问题时(如Hot100第112题"路径总和"),在递归参数中维护当前路径和可以避免全局变量:
python复制def hasPathSum(root, targetSum):
def dfs(node, current_sum):
if not node:
return False
current_sum += node.val
if not node.left and not node.right: # 叶子节点
return current_sum == targetSum
return dfs(node.left, current_sum) or dfs(node.right, current_sum)
return dfs(root, 0)
3.2 前序与中序序列重建二叉树
Hot100第105题"从前序与中序遍历序列构造二叉树"考察对遍历顺序的理解:
python复制def buildTree(preorder, inorder):
if not preorder or not inorder:
return None
root_val = preorder[0]
root = TreeNode(root_val)
idx = inorder.index(root_val)
root.left = buildTree(preorder[1:idx+1], inorder[:idx])
root.right = buildTree(preorder[idx+1:], inorder[idx+1:])
return root
3.3 二叉搜索树验证
Hot100第98题"验证二叉搜索树"需要特别注意边界值处理:
python复制def isValidBST(root):
def helper(node, lower=float('-inf'), upper=float('inf')):
if not node:
return True
val = node.val
if val <= lower or val >= upper:
return False
return helper(node.left, lower, val) and helper(node.right, val, upper)
return helper(root)
4. Hot100二叉树题目中的三个易错点
4.1 指针修改陷阱
在Hot100第114题"二叉树展开为链表"中,直接修改左指针会导致信息丢失:
python复制def flatten(root):
if not root:
return
flatten(root.left)
flatten(root.right)
left = root.left
right = root.right
root.left = None
root.right = left
p = root
while p.right:
p = p.right
p.right = right
4.2 空节点处理
Hot100第101题"对称二叉树"需要特别注意空节点情况:
python复制def isSymmetric(root):
def check(p, q):
if not p and not q:
return True
if not p or not q:
return False
return p.val == q.val and check(p.left, q.right) and check(p.right, q.left)
return check(root.left, root.right)
4.3 重复计算问题
在Hot100第124题"二叉树中的最大路径和"中,使用后序遍历可以避免重复计算:
python复制def maxPathSum(root):
res = float('-inf')
def helper(node):
nonlocal res
if not node:
return 0
left = max(helper(node.left), 0)
right = max(helper(node.right), 0)
res = max(res, left + right + node.val)
return max(left, right) + node.val
helper(root)
return res
5. 二叉树在Hot100中的进阶应用
5.1 最近公共祖先问题
Hot100第236题"二叉树的最近公共祖先"展示了后序遍历的威力:
python复制def lowestCommonAncestor(root, p, q):
if not root or root == p or root == q:
return root
left = lowestCommonAncestor(root.left, p, q)
right = lowestCommonAncestor(root.right, p, q)
if left and right:
return root
return left if left else right
5.2 序列化与反序列化
Hot100第297题"二叉树的序列化与反序列化"考察对遍历顺序的深入理解:
python复制def serialize(root):
if not root:
return "None"
return str(root.val) + "," + serialize(root.left) + "," + serialize(root.right)
def deserialize(data):
def helper(queue):
val = queue.popleft()
if val == "None":
return None
node = TreeNode(int(val))
node.left = helper(queue)
node.right = helper(queue)
return node
queue = deque(data.split(","))
return helper(queue)
5.3 二叉树与动态规划
Hot100第96题"不同的二叉搜索树"展示了二叉树与DP的结合:
python复制def numTrees(n):
dp = [0] * (n + 1)
dp[0], dp[1] = 1, 1
for i in range(2, n + 1):
for j in range(1, i + 1):
dp[i] += dp[j - 1] * dp[i - j]
return dp[n]
在实际刷Hot100的过程中,我发现很多二叉树题目看似不同,实则核心解法相通。比如掌握了后序遍历模板,就能解决路径和、最近公共祖先、序列化等多个问题。建议先吃透10道经典题目,再通过变式练习举一反三
