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

文章目录

  • Leetcode108
    • 1.题目描述
    • 2.解决方案
  • 面试题04.02
    • 1.题目描述
    • 2.解决方案
  • 面试题04.05
    • 1.问题描述
    • 2.解决方案
      • 解法一:中序遍历(省空间递归)
      • 解法二:最大最小法

Leetcode108

1.题目描述

【Leetcode程序员面试金典-二叉树】Leetcode108. 将有序数组转换为二叉搜索树 面试题04.02.最小高度树 面试题04.05.合法二叉搜索树_第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.题目描述

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

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.问题描述

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

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

你可能感兴趣的:(#,二叉树(其他),leetcode)