递归法(未优化版)
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==p||root==q||root==NULL) return root;
TreeNode* left=NULL;
TreeNode* right=NULL;
if(p->val<root->val&&q->val<root->val){ //目标值在左边
left=lowestCommonAncestor(root->left,p,q);
}
if(p->val>root->val&&q->val>root->val){ //目标值在右边
right=lowestCommonAncestor(root->right,p,q);
}
if((p->val<root->val&&q->val>root->val)||(p->val>root->val&&q->val<root->val)){
left=lowestCommonAncestor(root->left,p,q);
right=lowestCommonAncestor(root->right,p,q);
}
if(left!=NULL&&right!=NULL) return root;
else if(left!=NULL) return left;
else if(right!=NULL) return right;
else return NULL;
}
};
递归法(优化版)
因为二叉搜索树是有序的,所以本解法就是标准的搜索⼀条边的写法。遇到递归函数的返回值,如果不为空,立刻返回。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* cur, TreeNode* p, TreeNode* q) {
if (cur == NULL) return cur;//可加可不加,题目中说一定会找到公共祖先
// 中
if (cur->val > p->val && cur->val > q->val) { // 左
TreeNode* left = lowestCommonAncestor(cur->left, p, q);
if (left != NULL) {
return left;
}
}
if (cur->val < p->val && cur->val < q->val) { // 右
TreeNode* right = lowestCommonAncestor(cur->right, p, q);
if (right != NULL) {
return right;
}
}
return cur;
}
};
迭代法
class Solution{
public:
TreeNode* lowestCommonAncestor(TreeNode* root,TreeNode* p,TreeNode* q){
while(root!=NULL){
if(root->val>p->val&&root->val>q->val){//左
root=root->left;
}
//注意else if 的用法,某条语句执行,下面受它影响的语句就不能执行,否则会发生意想不到的结果
//比如上面的语句如果执行了,那么root的内容就会发生改变,而下面的语句又会用到这个root,会有冲突
else if(root->val<p->val&&root->val<q->val){//右
root=root->right;
} else return root;
}
return NULL;
}
};
总结
对于⼆叉搜索树的最近祖先问题,其实要⽐普通⼆叉树公共祖先问题简单的多。
不⽤使⽤回溯,⼆叉搜索树⾃带⽅向性,可以⽅便的从上向下查找⽬标区间,遇到⽬标区间内的节点,直接返回。
最后给出了对应的迭代法,⼆叉搜索树的迭代法甚⾄⽐递归更容易理解,也是因为其有序性(⾃带⽅向性),按照⽬标区间找就⾏了。