思路 :
- 假如一个结点为根结点,则两个结点的最近公共祖先为根结点
- 看 q. p 结点在 树的 左子树中还是右子树
- 如果 两个结点 一个位于左子树 另一个位于 右子树 则 其最近的公共祖先 为 根节点
- 分别在左右子树中递归查找
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (p == root || q == root) {
return root;
}
boolean pInLeft = containsNode(root.left, p);
boolean qInLeft = containsNode(root.left, q);
if (pInLeft && !qInLeft) {
return root;
}
if (!pInLeft && qInLeft) {
return root;
}
if (pInLeft) {
return lowestCommonAncestor(root.left, p, q);
} else {
return lowestCommonAncestor(root.right, p, q);
}
}
private boolean containsNode(TreeNode root, TreeNode p) {
if (root == null) {
return false;
}
if (root == p) {
return true;
}
if (containsNode(root.left, p)) {
return true;
}
return containsNode(root.right, p);
}