题目源自于leetcode。
题目:Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
可参考姐妹问题:根据单链表构造二叉查找树 Convert Sorted List to Binary Search Tree
思路:注意这里要的是平衡的BST。递归思想+二分查找法。把正中间的数作为树根,然后左和右两半段作为左子树和右子树。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *sortedArrayToBST(vector<int> &num) {
int n = num.size();
if(n == 0)//结束条件
return NULL;
vector<int> leftv, rightv;
int i;
for(i=0;i<n/2;i++)
leftv.push_back(num[i]); //给左半段序列新建一个vector
TreeNode *p = new TreeNode(num[i]);
for(i++;i<n;i++)
rightv.push_back(num[i]);//给右半段序列新建一个vector
p->left = sortedArrayToBST(leftv);
p->right = sortedArrayToBST(rightv);
return p;
}
};
代码二:代码一中使用了附加空间,就是左右两半的临时vector。可以添加两个下标作为参数,然后原地使用vector来进行递归。
class Solution {
public:
TreeNode *sortedArrayToBST(vector<int> &num) {
if(num.empty())
return NULL;
return generate(num, 0, num.size()-1);
}
TreeNode *generate(vector<int> &num, int left, int right)
{
if(left > right)
return NULL;
int mid = (right+left)/2;
TreeNode *root = new TreeNode(num[mid]);
root->left = generate(num, left, mid-1);
root->right = generate(num, mid+1, right);
return root;
}
};