题目描述:
给定一个有序数组,数组元素升序排列,将该有序数组转换为一个平衡二叉搜索树。
思路:
首先,这个问题很容易用递归方法来解决。所谓的平衡的定义:就是二叉树的子树高度之差不能超过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){
return dfs(0,nums.size()-1,nums);
}
TreeNode *dfs(int left,int right, vector<int> nums){
if(left>right) return NULL;
int mid=(left+right)>>1;
TreeNode *node = new TreeNode(nums[mid]);
node->left = dfs (left, mid-1, nums);
node->right = dfs (mid+1, right, nums);
return node;
}
};