Algorithm 这段代码使用什么算法来查找二叉树的最低公共祖先?

Algorithm 这段代码使用什么算法来查找二叉树的最低公共祖先?,algorithm,binary-tree,lowest-common-ancestor,Algorithm,Binary Tree,Lowest Common Ancestor,在尝试解决此问题时,我在Leetcode上找到了此解决方案: Leetcode上的每个人似乎都认为这是理所当然的。但我不明白。这里发生了什么?它使用什么算法来寻找二叉树的生命周期评价 public TreeNode lowestCommonAncestorBinaryTree(TreeNode root, TreeNode p, TreeNode q) { if(root==null) { return null; } if(root==p) {

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

Leetcode上的每个人似乎都认为这是理所当然的。但我不明白。这里发生了什么?它使用什么算法来寻找二叉树的生命周期评价

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;
}
很简单:

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

如果它不在根中,它将在根的左右子树中搜索,重复此过程,直到
root
实际上是
p
q

然后是最后3个
if
s

  • if(left!=null&&right!=null)返回root

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

  • if(left!=null&&right==null)返回left

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

  • if(right!=null&&left==null)返回right

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

  • 否则,节点不在树中,也没有LCA

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