二分查找的边界问题(初始状态要和内循环状态保持一致):
- 如代码(1)中,一开始的状态为(0,nums.size()),即为左闭右开的状态**[left,right)**,因此内循环的状态应该是(low,mid)和(mid + 1, high)且当high <= low的时候,就返回NULL。
- 如代码(2)中,一开始的状态为(0,nums.size() - 1),即为左闭右闭的状态**[left,right]**,因此内循环的状态应该是(low,mid - 1)和(mid + 1, high), 且只有当high < low的时候才返回NULL。
/**
* 代码(1)
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return traverse(nums, 0, nums.size());
}
TreeNode* traverse(vector<int>& nums, int low, int high){
if(high <= low) return NULL;
int mid = low + (high - low) / 2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = traverse(nums,low,mid);
root->right = traverse(nums,mid + 1,high);
return root;
}
};
/**
* 代码(2)
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return traverse(nums, 0, nums.size() - 1);
}
TreeNode* traverse(vector<int>& nums, int low, int high){
if(high < low) return NULL;
int mid = low + (high - low) / 2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = traverse(nums,low,mid - 1);
root->right = traverse(nums,mid + 1,high);
return root;
}
};