【Leetcode程序员面试金典-二叉树】Leetcode108. 将有序数组转换为二叉搜索树 面试题04.02.最小高度树 面试题04.05.合法二叉搜索树

Leetcode108

1.题目描述

在这里插入图片描述

2.解决方案

根据mid的不同选择分为三种写法,其他代码和下一题面试题04.02一样:

1.总是选择中间位置左边的数字作为根节点

int mid = (left + right) / 2;

2.总是选择中间位置右边的数字作为根节点

int mid = (left + right + 1) / 2;

3.选择任意一个中间位置数字作为根节点

Random rand = new Random();
int mid = (left + right + rand.nextInt(2)) / 2;


面试题04.02

1.题目描述

在这里插入图片描述

2.解决方案

//递归正确解法
class Solution {
public:
    TreeNode* create(vector<int>& nums,int start,int end){
        if(start>end) return nullptr;
        int mid=(start+end)/2;

        TreeNode* cur=new TreeNode(nums[mid]);
        cur->left=create(nums,start,mid-1);
        cur->right=create(nums,mid+1,end);
        return cur;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        //return create(nums,0,nums.size()); //长度记得减一
        return create(nums,0,nums.size()-1);
    }
};

面试题04.05

1.问题描述

在这里插入图片描述

2.解决方案

解法一:中序遍历(省空间递归)

//中序遍历(省空间递归)正确写法
class Solution {
public:
    //LastNum不能声明成int会变成0
    long long lastNum=INT64_MIN;
    bool isValidBST(TreeNode* root) {
        if(root== nullptr) return true;

        //左
        if(isValidBST(root->left)== false) return false;

        //中(中序遍历是一个不断变大的过程)
        if(root->val>lastNum){
            lastNum=root->val;
            //这不能返回true因为这返回了相当于右子树完全没检查
            //return true;
        }
        else return false;

        //右
        if(isValidBST(root->right)== false) return false;

        //??为什么还有写这个
        //因为上面规定的都是return false的情况如果走到这还没有return false那就是return true了
        //相当于整棵树左右子树根都检查完了都没有 return false那就是true了
        return true;
    }
};

解法二:最大最小法

//最小最大法正确写法
class Solution1 {
public:
    bool check(TreeNode* root,long long min,long long max){
        //必须做的检查不能忘
        if(root== nullptr) return true;

        //根节点是否落在范围里
        if(!(min<root->val&&root->val<max)) return false;

        //能走到这说明根节点是在范围内的
        //1.左子树
        if(!check(root->left,min,root->val)) return false;

        //2.右子树
        if(!check(root->right,root->val,max)) return false;

        //走到这证明根节点左右子树都没问题,如果有问题就return false了
        return true;
    }
    bool isValidBST(TreeNode* root) {
        return check(root,INT64_MIN,INT64_MAX);
    }
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值