题目:Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
思路:给出一个排序的数组,如何构造一个平衡二叉查找树?平衡二叉查找树要求任一结点的左右子树的高度差不能超过一,也叫做高度平衡树。如果让我们从一个排序数组中选取一个元素做树的根,我们会选择哪一个树呢?凭直觉,我们觉得应该选择数组的中间值做根,事实也是这样,平衡二叉查找树(AVL树)的根应该是排序数组的中间元素。(我们把排序数组的中间节点作为根,可保证左右子树的元素个数差不超过1,则肯定是平衡二叉树。但并不是唯一的AVL树,不过工程中这种选择中间节点做根的查找树很常用,方便二分查找。)我们用这个元素创建树的根结点,接下来剩下左右两部分的数组,继续选择中间元素,进行递归,左子树的根应该是左部分数组的中间元素,同理右子树的根也是右部分数组的中间元素。利用了分而治之的方法,不断解决子问题。
Attention:
1. 递归终止条件,start > end, 返回NULL. 也包含了数组为空的情况(start = 0, end = -1)。
AC Code:
/**
* 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) {
return sortedArrayToBST_helper(num, 0, num.size()-1);
}
private:
TreeNode* sortedArrayToBST_helper(vector<int> &num, int start, int end)
{
if(start > end)
return NULL;
int mid = start + (end - start)/2;
TreeNode* root = new TreeNode(num[mid]);
root->left = sortedArrayToBST_helper(num, start, mid-1);
root->right = sortedArrayToBST_helper(num, mid+1, end);
return root;
}
};