二叉搜索树的最近公共祖先

在这里插入图片描述

递归法(未优化版)

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;
    }
};

总结

对于⼆叉搜索树的最近祖先问题,其实要⽐普通⼆叉树公共祖先问题简单的多。
不⽤使⽤回溯,⼆叉搜索树⾃带⽅向性,可以⽅便的从上向下查找⽬标区间,遇到⽬标区间内的节点,直接返回。

最后给出了对应的迭代法,⼆叉搜索树的迭代法甚⾄⽐递归更容易理解,也是因为其有序性(⾃带⽅向性),按照⽬标区间找就⾏了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值