将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
/**
* 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 dfs(nums,0,nums.size()-1);
}
TreeNode* dfs(vector<int>& nums,int lo,int hi){
if(lo>hi) return NULL;
int mid = lo + (hi-lo)/2;
TreeNode* root = new TreeNode (nums[mid]);
root->left = dfs(nums,lo,mid-1);
root->right = dfs(nums,mid+1,hi);
return root;
}
};
因为是有序数组,需要生成的是一棵高度平衡的二叉搜索树。要求有两点:1.任何一个根节点的左右子树的高度差不能超过1,2.左子树都小于根节点,右子树都大于根节点
基于这两个条件,我们利用中序遍历+二分法来建造这棵二叉树。为什么中序遍历就可以?
因为这是个有序数组,那么只要取中间那个数,左边的是不是都比它小了,右边的都比它大。先将中间那个数作为root,再递归左边构建左子树,再递归右边。
什么时候return,当然是lo>hi的时候,代表没有数字可以取了,那么就返回NULL