我已在此代码
中找到了解决此问题的方法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;
}
我似乎无法理解最后一行。有人可以帮我理解代码在最后一行的工作原理。
答案 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;
}
}