返回

LeetCode 点睛:破解 Offer 68 - II 的二叉树最近公共祖先奥秘

见解分享

二叉树中最近公共祖先的奥秘:LeetCode Offer 68 - II

踏入算法的世界,LeetCode 犹如一盏明灯,照亮前行之路。今天,我们聚焦于 Offer 68 - II,探寻二叉树中最近公共祖先的奥秘。

何谓最近公共祖先?

在计算机科学中,最近公共祖先(LCA)指的是一棵树中两个节点的最近共同祖先。换言之,LCA 是位于两节点路径上的最高共同节点。

LeetCode 题目详解

在 Offer 68 - II 中,我们被要求找到一棵二叉树中两个指定节点的最近公共祖先。为了解决这一问题,我们可以运用后序遍历算法。

后序遍历的奥妙

后序遍历遵循如下步骤:

  1. 首先,我们访问左子树。
  2. 然后,我们访问右子树。
  3. 最后,我们访问当前节点。

后序遍历的妙处在于,它允许我们以逆序的方式处理节点。这意味着我们可以先找到两个节点的父节点,然后继续向上传递,直到找到它们的最近公共祖先。

具体步骤

  1. 初始化一个哈希表: 我们创建一个哈希表来存储节点的父节点映射。
  2. 后序遍历二叉树: 按照后序遍历算法遍历二叉树,同时更新哈希表中的父节点映射。
  3. 找出两个节点的父节点: 使用哈希表找出两个指定节点的父节点。
  4. 向上遍历: 从两个节点的父节点开始,沿着父节点映射向上遍历,直到找到第一个共同的父节点。这个共同的父节点就是最近公共祖先。

代码示例(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);
        }
    }
}

结论

通过后序遍历和哈希表,我们可以高效地找到二叉树中两个指定节点的最近公共祖先。这种方法简单易懂,适用于各种二叉树场景。

常见问题解答

  1. 什么是一棵树? 树是一种数据结构,它由一个根节点和一系列子节点组成,子节点通过边连接到根节点。
  2. 最近公共祖先有什么应用? LCA 在解决各种计算机科学问题中都有应用,例如查找二叉树的深度、检查两节点是否连接以及在社交网络中查找共同祖先。
  3. 后序遍历有什么好处? 后序遍历允许我们以逆序的方式处理节点,这对于某些问题(如查找 LCA)非常有用。
  4. 如何使用哈希表存储父节点映射? 哈希表是一种数据结构,它允许我们根据键快速查找值。我们可以使用节点作为键,将父节点存储为值。
  5. 如何高效地向上遍历找到 LCA? 我们可以从两个节点的父节点开始,沿着父节点映射向上遍历,直到找到第一个共同的父节点。