题目
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5]
它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
题目描述
- 要求:有序数组 ==> 二叉搜索树
分析
因为二叉树的左右高度差小于等于1
所以直接取数组中间值 ==> 数组对半分
(中间值为根结点左边为左子树右边为右子树 ==> 递归)
解题思路
变量 | 作用 |
---|---|
mid | 数组的中间值 |
left | 左边的数组 |
right | 右边的数组 |
过程
- 取数组的中间值 ==> 作为当前根结点
- 记录左边数组 + 右边数组
- 递归求解左孩子结点 + 右孩子结点
代码如下
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.size() == 0) return NULL;
int mid = nums.size()/2;
TreeNode* root = new TreeNode;
root->val = nums[mid]; //中间值作为当前的根结点
vector<int> left;
vector<int> right;
for(int i = 0; i < mid; ++i) { //左边数组
left.push_back(nums[i]);
}
for(int i = mid + 1; i < nums.size(); ++i) { //右边数组
right.push_back(nums[i]);
}
root->left = sortedArrayToBST(left); //寻找左节点
root->right = sortedArrayToBST(right); //寻找右节点
return root;
}
};