Java中最低的共同祖先

时间:2016-05-08 05:26:34

标签: java

我已在此代码

中找到了解决此问题的方法
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    if(root == null) return null;
    if(root == p || root == q) return root;
    TreeNode left = lowestCommonAncestor(root.left, p, q);
    TreeNode right = lowestCommonAncestor(root.right, p, q);
    return left != null && right != null ? root : left == null ? right : left; 
}

我似乎无法理解最后一行。有人可以帮我理解代码在最后一行的工作原理。

2 个答案:

答案 0 :(得分:1)

我假设您知道这会使用ternary operator

如果您看到它被括号括起来可能更容易理解:

return (left != null && right != null ? root : (left == null ? right : left));

意思是,这可以改写为以下嵌套if:

if (left != null && right != null) {
    return root;
} else {
    if (left == null) {
        return right;
    } else {
        return left;
    }
}

所以让我们分解吧。您已经递归检查了左子子树和右子子树。现在您需要确定要返回的节点。

如果两个子节点都存在(left != null && right != null),则两个子树的最低共同祖先是当前节点,即root,这就是您返回它的原因。

但是,如果其中一个子树不存在,例如在以下情况下查看只有一个孩子的node2

         root
        /    \
     node1   node2
    /     \       \
node3    node4    node5

然后根不能是最低的共同祖先,这意味着它必须在其中一个子树中。由于其中一个是null(不存在),所以它必须在另一个中。

所以如果left == null然后返回你在​​右子树上找到的最低共同祖先,否则右子树不存在(是null)所以返回最低的共同点您在左侧子树上找到的祖先。

答案 1 :(得分:1)

ternary operator用于确定返回的值。如果你适当地设置大括号,它会更加清晰:

return (left != null && right != null) ? root : ((left == null) ? right : left);

或者,您可以重写要使用的语句,这可能会使它更清晰:

if (left != null && right != null) {
    return root;
} else {
    if (left == null) {
        return right;
    } else {
        return left;
    }
}