将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5
平衡二叉树(AVL树)被定义为其左子树和右子树都是高度平衡的二叉树,且左子树和右子树的高度之差的绝对值不超过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) {
if(nums.size() == 0)
return NULL;
return build(nums, 0, nums.size()-1); //起始点和终止点
}
TreeNode* build(vector<int> nums,int start,int end){
if(start > end)
return NULL;
int mid = (end+ start+1)/2;
TreeNode* node = new TreeNode(nums[mid]);
node -> left = build(nums, start, mid-1);
node -> right = build(nums, mid+1, end);
return node;
}
};
这个很慢
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if (nums.empty())
return NULL;
if (nums.size() == 1) {
return new TreeNode(nums[0]);
}
int mid_index = (nums.size()-1)/2;
TreeNode *node = new TreeNode(nums[mid_index]);
vector<int> left_nums;
vector<int> right_nums;
for (int i=0; i<mid_index; i++)
left_nums.push_back(nums[i]);
for (int i=mid_index+1; i<nums.size(); i++)
right_nums.push_back(nums[i]);
node->left = sortedArrayToBST(left_nums);
node->right = sortedArrayToBST(right_nums);
return node;
}
};
TreeNode* node = new TreeNode(节点值)