【Leetcode二叉树的公共祖先问题四】235. 二叉搜索树的最近公共祖先(有关于二叉搜索树做题的一些经验!!!)

Leetcode235

1.问题描述

在这里插入图片描述

2.解决方案

解法一:递归

以后但凡遇见二叉搜索树就要想递归绝对不是回溯递归,因为天生有序,但是这道题应该如何运用呢,我们自然而然的应该剖析最近公共祖先和两个节点的大小关系,然后意识到是区间内的关系,那么递归顺序就出来了!
1.如果大于两个结点就去左子树找
2.如果小于两个结点就去右子树找
3.除了这两种情况那不就是在区间内了嘛,直接返回当前结点root

在这里插入图片描述

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    	//百分之百不会从这走,因为题目说p,q一定存在
        if(root== nullptr) return nullptr;

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

        //不大于不小于那就说明 root->val在[p->val,q->val]范围里面了
        return root;
    }
};


解法二:迭代

和递归的分析一摸一样,就是迭代一下,这也是二叉搜索树迭代的优势不需要回溯!

class Solution1 {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        while(root!= nullptr){
            if(root->val>p->val&&root->val>q->val) {root=root->left; continue;}
            if(root->val<p->val&&root->val<q->val) {root=root->right; continue;}

            return root;
        }

        //百分之百不会从这走,因为题目说p,q一定存在
        return nullptr;
    }
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值