将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5
以前做过的一道easy题,隔了好久,二刷竟然还想了好一会儿,得立个flag长长记性。做这道题首先得了解什么是二叉搜索树,左子树所有节点的值都要小于父节点,右子树的所有结点都要大于父节点,二叉搜索树的中序遍历就是递增的。其次,你要对深搜了解吧,这里其实每次都在进行二分,找到左右部分的中间位置的值与父节点进行比较,大于则在左子树,小于在右子树。细节见代码:
/**
* 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:
void create(vector<int> &nums, TreeNode *root, int l, int r)
{
if (l <= r)
{
TreeNode *tn = root;
int index = (l + r) / 2;
TreeNode *temp = new TreeNode(nums[index]);
if (temp->val <= tn->val)
{
tn->left = temp;
tn = temp;
}
else
{
tn->right = temp;
tn = temp;
}
create(nums, tn, l, index - 1);
create(nums, tn, index + 1, r);
}
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode *root = NULL;
if (nums.size() == 0)
{
return root;
}
if (nums.size() == 1)
{
root = new TreeNode(nums[0]);
return root;
}
int index = (nums.size() - 1) / 2;
root = new TreeNode(nums[index]);
create(nums, root, 0, index - 1);
create(nums, root, index + 1, nums.size() - 1);
return root;
}
};
二刷很重要。