1. 二叉树后序遍历的递归实现与思考
二叉树的后序遍历是算法学习中最基础的内容之一,但往往也是面试中最容易被考察的细节。后序遍历的顺序是"左-右-根",这种遍历方式在处理某些特定问题时非常有用,比如计算目录大小、释放二叉树内存等场景。
递归实现后序遍历的代码看似简单,但有几个关键点需要注意:
cpp复制void postorder(TreeNode* root, vector<int>& res) {
if(root == nullptr) return; // 递归终止条件
postorder(root->left, res); // 遍历左子树
postorder(root->right, res); // 遍历右子树
res.push_back(root->val); // 访问根节点
}
这段代码的精妙之处在于它的简洁性和自描述性。递归的三步走策略完美对应了后序遍历的定义。在实际应用中,我发现有几个常见的误区:
- 空指针检查:忘记检查root是否为nullptr是新手最常见的错误,这会导致程序崩溃。
- 参数传递:结果列表res必须使用引用传递,否则每次递归调用都会创建新的拷贝。
- 访问顺序:一定要确保左右子树递归调用在前,根节点处理在后。
提示:在面试中,面试官可能会要求你解释为什么后序遍历适合某些特定问题,比如计算表达式树的值。这时候要能清楚地说明遍历顺序与问题解决逻辑的对应关系。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 最近公共祖先问题的深度解析
二叉树的最近公共祖先(LCA)问题是一个经典的算法问题,在236题中得到了很好的体现。理解这个问题的解法对于掌握树形问题的递归思维非常有帮助。
LCA问题的递归解法基于以下几个关键观察点:
- 如果当前节点本身就是p或q,且另一个节点在其子树中,那么当前节点就是LCA。
- 如果p和q分别出现在左右子树中,当前节点就是LCA。
- 如果只有一边的子树包含p或q,则LCA必定在该子树中。
cpp复制TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == nullptr || root ==
