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