1. 二叉树递归算法精讲:从翻转二叉树到深度计算
作为一名算法工程师,我深知二叉树是数据结构中最基础也最常考的类型。今天要分享的这四道LeetCode题目(226、101、104、111)堪称二叉树递归的"黄金训练场",涵盖了前序、后序遍历的应用场景,以及深度/高度计算中的各种陷阱。这些题目看似简单,但如果没有真正理解递归的本质,很容易写出看似正确实则漏洞百出的代码。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. LC 226 - 翻转二叉树:遍历顺序的选择艺术
2.1 问题描述与直观解法
翻转二叉树的问题要求我们将二叉树中每个节点的左右子树进行交换。想象一下把一棵树放在镜子前,镜中的影像就是翻转后的结果。最直观的解法就是递归遍历每个节点,交换其左右子节点。
python复制def invertTree(root):
if not root:
return None
# 交换左右子树
root.left, root.right = root.right, root.left
# 递归处理子树
invertTree(root.left)
invertTree(root.right)
return root
这个实现采用了前序遍历(根-左-右)的顺序。我们首先处理当前节点(交换左右子树),然后递归处理左右子树。这种顺序非常符合直觉,就像我们手动翻转时也会先交换最顶层的节点,再逐层向下。
2.2 为什么中序遍历不行?
很多初学者会尝试用中序遍历(左-根-右)来实现翻转,结果发现得到的树并不正确。让我们看看中序遍历的问题出在哪里:
python复制def invertTree_wrong(root):
if not root:
return None
invertTree_wrong(root.left) # 先处理左子树
root.left, root.right = root.right, root.left # 交换
invertTree_wrong(root.left) # 注意:此时处理的其实是原来的右子树!
return root
问题在于:当我们交换完左右子树后,原来的右子树现在变成了左子树。接着我们递归处理"左子树"时,实际上是在处理原来的右子树,导致部分节点被翻转了两次,而有些节点则完全没有被处理。
关键理解:中序遍历在访问根节点前后都会处理左子树,交换操作会打乱原本的遍历顺序。
2.3 后序遍历的实现与比较
后序遍历(左-右-根)也能正确实现翻转:
python复制def invertTree_postorder(root):
if not root:
return None
left = invertTree_postorder(root
