将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5 ///
之前做到过二叉搜索树的题目,特点是右子树比根节点大,左子树比根节点小。这道题附加了一个条件,要求高度差不超过1。
给的条件是“升序排列”,那思路就有了,直接找数组中间值作为根节点,因为是升序,中间值的位置就在数组的中点。用中间值把数组分割成两部分,前半部分都是小于中间值的,后半部分都大于中间值。将新得到的两个数组继续做相同的处理,前半部分返回值为左子树,后半部分的返回值为右子树。直到数组长度为1,创建一个节点并赋值为这个长度为1的数组的值,返回即可。
如果数组长度为0,返回NULL。
class Solution
{
public:
TreeNode *sortedArrayToBST(vector<int>& nums) {
TreeNode *n;
TreeNode *root = new TreeNode(0);
TreeNode *left = new TreeNode(0);
TreeNode *right = new TreeNode(0);
vector<int> l;
vector<int> r;
if (nums.size() == 0)
return NULL;
if (nums.size()!=1)
{
l.clear();
r.clear();
int d;
if(nums.size()%2==0)
d = nums.size() / 2;
else
d = (nums.size() - 1) / 2;
root->val = nums[d];
for (int i = 0; i < d; i++)
l.push_back(nums[i]);
for (int j = d+1; j < nums.size(); j++)
r.push_back(nums[j]);
left = sortedArrayToBST(l);
right = sortedArrayToBST(r);
root->left = left;
root->right = right;
}
else
root->val = nums[0];
return root;
}
};