【问题标题】:What algorithm is this code using to find the lowest common ancestor of a binary tree?该代码使用什么算法来查找二叉树的最低共同祖先?
【发布时间】:2020-01-26 06:21:36
【问题描述】:

我在尝试解决这个问题时在 Leetcode 上找到了这个解决方案:

https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/

Leetcode 上的每个人似乎都理所当然地认为这是如何工作的。但我不明白。这是怎么回事,这是用什么算法来找到二叉树的 LCA?

public TreeNode lowestCommonAncestorBinaryTree(TreeNode root, TreeNode p, TreeNode q) {
    if(root==null) {
        return null;
    }
    if(root==p) {
        return p;
    }
    if(root==q) {
        return q;
    }
    TreeNode left = lowestCommonAncestorBinaryTree(root.left, p, q);
    TreeNode right = lowestCommonAncestorBinaryTree(root.right, p, q);
    if (left != null && right != null) {
        return root;
    }
    if(left!=null && right==null) {
        return left;
    }
    if(right!=null && left==null) {
        return right;
    }
    return null;
}

【问题讨论】:

  • 没有所谓的“二叉树的最低共同祖先”;这个问题实际上要求你在二叉树中找到两个节点的最低共同祖先。

标签: algorithm binary-tree lowest-common-ancestor


【解决方案1】:

很简单:

代码查看树的根。如果根是pq,则返回它。

如果不在根中,则在根的左右子树中搜索,重复该过程直到root实际上是pq

然后是最后 3 个ifs。

  1. if (left != null && right != null) return root;

    这意味着它在根的左子树中找到了一个节点,在根的右子树中找到了另一个节点,因此根是 LCA。

  2. if(left != null && right == null) return left;

    这意味着它在左子树中找到了一个节点但在右子树中没有节点,那么左节点是另一个节点的父节点,因此是LCA。

  3. if(right != null && left == null) return right;

    这意味着它在右子树中找到了一个节点,但在左子树中没有节点,则右节点是另一个节点的父节点,因此是 LCA。

否则,节点不在树中并且没有 LCA。

【讨论】:

    猜你喜欢
    • 2011-07-28
    • 2012-11-08
    • 2017-02-21
    • 1970-01-01
    • 2012-01-16
    • 2018-03-09
    • 2021-12-09
    • 1970-01-01
    • 2017-04-04
    相关资源
    最近更新 更多