剑指 Offer 68 - I.二叉搜索树的最近公共祖先
思路:找规律 !如果q,p一个比root大一个比root小,那q,p分布在root的左右两边,且root的左右子节点一定不是p,q的公共祖先,所以p,q的最近公共祖先是root;如果q,p其中一个等于root,那他们的公共祖先就是root;如果q,p同时小于root或者同时大于root,那就要继续向左或向右搜索。
迭代法:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while(root != null) {
if(p.val > root.val && q.val > root.val) root = root.right;
else if(p.val < root.val && q.val < root.val) root = root.left;
else break;
}
return root;
}
}
时间复杂度O(N)
空间复杂度O(1)
递归:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(p.val > root.val && q.val > root.val) return lowestCommonAncestor(root.right, p, q);
else if(p.val < root.val && q.val < root.val) return lowestCommonAncestor(root.left, p, q);
else return root;
}
}