返回
LeetCode 点睛:破解 Offer 68 - II 的二叉树最近公共祖先奥秘
见解分享
2024-01-30 00:52:36
二叉树中最近公共祖先的奥秘:LeetCode Offer 68 - II
踏入算法的世界,LeetCode 犹如一盏明灯,照亮前行之路。今天,我们聚焦于 Offer 68 - II,探寻二叉树中最近公共祖先的奥秘。
何谓最近公共祖先?
在计算机科学中,最近公共祖先(LCA)指的是一棵树中两个节点的最近共同祖先。换言之,LCA 是位于两节点路径上的最高共同节点。
LeetCode 题目详解
在 Offer 68 - II 中,我们被要求找到一棵二叉树中两个指定节点的最近公共祖先。为了解决这一问题,我们可以运用后序遍历算法。
后序遍历的奥妙
后序遍历遵循如下步骤:
- 首先,我们访问左子树。
- 然后,我们访问右子树。
- 最后,我们访问当前节点。
后序遍历的妙处在于,它允许我们以逆序的方式处理节点。这意味着我们可以先找到两个节点的父节点,然后继续向上传递,直到找到它们的最近公共祖先。
具体步骤
- 初始化一个哈希表: 我们创建一个哈希表来存储节点的父节点映射。
- 后序遍历二叉树: 按照后序遍历算法遍历二叉树,同时更新哈希表中的父节点映射。
- 找出两个节点的父节点: 使用哈希表找出两个指定节点的父节点。
- 向上遍历: 从两个节点的父节点开始,沿着父节点映射向上遍历,直到找到第一个共同的父节点。这个共同的父节点就是最近公共祖先。
代码示例(Java)
class Solution {
private HashMap<TreeNode, TreeNode> parent = new HashMap<>();
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
dfs(root, null);
while (p != null) {
if (parent.containsKey(q)) {
return q;
}
q = parent.get(q);
}
return p;
}
private void dfs(TreeNode node, TreeNode par) {
if (node != null) {
parent.put(node, par);
dfs(node.left, node);
dfs(node.right, node);
}
}
}
结论
通过后序遍历和哈希表,我们可以高效地找到二叉树中两个指定节点的最近公共祖先。这种方法简单易懂,适用于各种二叉树场景。
常见问题解答
- 什么是一棵树? 树是一种数据结构,它由一个根节点和一系列子节点组成,子节点通过边连接到根节点。
- 最近公共祖先有什么应用? LCA 在解决各种计算机科学问题中都有应用,例如查找二叉树的深度、检查两节点是否连接以及在社交网络中查找共同祖先。
- 后序遍历有什么好处? 后序遍历允许我们以逆序的方式处理节点,这对于某些问题(如查找 LCA)非常有用。
- 如何使用哈希表存储父节点映射? 哈希表是一种数据结构,它允许我们根据键快速查找值。我们可以使用节点作为键,将父节点存储为值。
- 如何高效地向上遍历找到 LCA? 我们可以从两个节点的父节点开始,沿着父节点映射向上遍历,直到找到第一个共同的父节点。