大前提是知道二叉搜索书的特性左《根《右 的值
然后思路 很简单 但是不看题解的话我还是想不起来怎么版..
所以如果一个比我小,一个比我大就返回我;
都比我大就递归我的右边
都比我小就递归我的左边
就是写法常规思路有两个,一个用递归一个不用递归
方法一 递归
var lowestCommonAncestor = function(root, p, q){
if(!root) return null;
// 跟节点比两个都大 说明这两个都是在跟节点的左边
if(root.val>p.val && root.val>q.val) {
return lowestCommonAncestor(root.left, p,q);
}
// 跟上面相反在右边
if(root.val<p.val && root.val<q.val) {
return lowestCommonAncestor(root.right, p,q);
}
return root;
}
方法二 非递归
var lowestCommonAncestor = function(root, p, q){
if(!root) return null;
// 如果相等,公共祖先就是他们本身
// 这段代码 加不加 都行 加上效率会更改一点儿
if (p.val === q.val) return p;
while(root) {
// 跟节点比两个都大 说明这两个都是在跟节点的左边
if(root.val>p.val && root.val>q.val) {
root = root.left;;
} else
// 跟上面相反在右边
if(root.val<p.val && root.val<q.val) {
root = root.right;
} else { return root;}
}
}