题目描述
方法 1
假如不考虑二叉搜索树这个条件,针对任意树,寻找最近公共祖先:
采用动态规划的方法:寻找当前树包含的 key 的数量。(将 p 和 q 视为 key1,key2)
若找到 key 数量为 2 的节点,则寻找到结果
public class Solution1 {
private int key1, key2;
TreeNode result;
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
key1 = p.val;
key2 = q.val;
containsKey(root);
return result;
}
public int containsKey(TreeNode root) {
if (root == null) return 0;
int left = containsKey(root.left);
int right = containsKey(root.right);
if (root.val == key1 || root.val == key2) {
if (left + right + 1 == 2) {
result = root;
return 0; // 已找到 result,避免result再往上被父节点覆盖
}
else {
return left + right + 1;
}
} else {
if (left + right == 2) {
result = root;
return 0; // 已找到 result,避免result再往上被父节点覆盖
}
else {
return left + right;
}
}
}
}
方法 2
利用二叉搜索树,判断 root 的值与 p和 q 的值。若 root 的值大于 p 和 q,则祖先往 root左边找,若 root 的值小于 p 和 q,则祖先往 root 右边找。否则,root 就是祖先。
public class Solution2 {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
int pVal = p.val;
int qVal = q.val;
while (root != null) {
int rootVal = root.val;
if (rootVal > pVal && rootVal > qVal) {
root = root.left;
}
else if (rootVal < pVal && rootVal < qVal) {
root = root.right;
}
else {
break;
}
}
return root;
}
}
如有遗漏,欢迎指正