资讯动态

二叉树最近公共祖先(LCA)算法详解与实现

发布时间:2026/9/13 9:24:48 来源:尧图企业网站定制
1. 问题背景与核心概念最近公共祖先Lowest Common Ancestor简称LCA是二叉树算法中的经典问题。给定一棵二叉树和两个节点p、q我们需要找到这两个节点在树中深度最大的公共祖先节点。这个问题在LeetCode Hot 100题库中被列为第236题是面试中高频出现的算法题目。理解这个问题需要掌握几个关键点祖先节点的定义若节点p在节点q的路径上或者节点q在节点p的路径上则称p是q的祖先或q是p的祖先公共祖先既是p的祖先又是q的祖先的节点最近公共祖先所有公共祖先中深度最大的那个节点2. 解题思路分析2.1 递归解法最直观的解法是使用递归遍历二叉树。递归的思路是如果当前节点是p或q则返回当前节点分别在左右子树中递归查找p和q如果左右子树都找到了结果说明当前节点就是LCA如果只有一边找到结果则返回该结果这种解法的时间复杂度是O(n)空间复杂度在最坏情况下也是O(n)当树退化为链表时。2.2 迭代解法另一种思路是使用迭代法通过记录每个节点的父节点信息然后从p和q分别向上回溯找到第一个公共节点。具体步骤使用栈或队列进行层次遍历记录每个节点的父节点从p节点开始向上回溯记录所有祖先节点从q节点开始向上回溯遇到的第一个在p祖先集合中的节点就是LCA这种方法同样具有O(n)的时间复杂度但需要额外的空间存储父节点信息。3. 代码实现与优化3.1 Python递归实现class Solution: def lowestCommonAncestor(self, root, p, q): if not root or root p or root q: return root left self.lowestCommonAncestor(root.left, p, q) right self.lowestCommonAncestor(root.right, p, q) if left and right: return root return left if left else right3.2 Java迭代实现class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { MapTreeNode, TreeNode parent new HashMap(); DequeTreeNode stack new ArrayDeque(); parent.put(root, null); stack.push(root); while (!parent.containsKey(p) || !parent.containsKey(q)) { TreeNode node stack.pop(); if (node.left ! null) { parent.put(node.left, node); stack.push(node.left); } if (node.right ! null) { parent.put(node.right, node); stack.push(node.right); } } SetTreeNode ancestors new HashSet(); while (p ! null) { ancestors.add(p); p parent.get(p); } while (!ancestors.contains(q)) { q parent.get(q); } return q; } }4. 常见问题与调试技巧4.1 边界条件处理在实际编码中有几个边界条件需要特别注意p或q就是根节点的情况p是q的祖先或q是p的祖先的情况树为空的情况p或q不在树中的情况根据题目假设通常不考虑4.2 调试技巧当递归解法出现问题时可以打印递归过程中的当前节点值检查左右子树的返回值是否正确使用小规模的测试用例手动模拟递归过程对于迭代解法可以打印父节点映射表检查回溯路径是否正确验证祖先集合是否包含正确的节点5. 算法优化与变种5.1 空间优化递归解法虽然简洁但在最坏情况下树退化为链表会使用O(n)的栈空间。可以改用尾递归优化或迭代版本来减少空间使用。5.2 多次查询优化如果需要多次查询不同节点对的LCA可以考虑预处理整棵树构建每个节点的深度和父节点信息这样每次查询可以在O(1)或O(logn)时间内完成。5.3 其他变种问题类似的问题变种包括二叉搜索树的LCA可以利用BST的性质优化普通树的LCA需要记录父节点或使用其他算法带父指针的树的LCA可以简化为链表相交问题6. 实际应用场景LCA算法在实际中有多种应用计算树中两个节点的最短路径长度深度(p)深度(q)-2*深度(LCA)计算树中两个节点的关系如家谱分析网络路由中的最近公共连接点查找版本控制系统中的最近共同祖先提交查找7. 学习建议与进阶路线对于想要深入掌握二叉树算法的学习者建议先掌握二叉树的基本遍历方法前序、中序、后序、层次理解递归在树问题中的应用从简单问题开始逐步过渡到复杂问题多做LeetCode上的二叉树相关题目建立解题直觉进阶学习路线可以包括学习更多树结构AVL树、红黑树、B树等掌握树形动态规划学习树的分治算法了解树的可持久化数据结构

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价