Minimal Tree:将一个排好序的数组转化为一棵高度最小的二叉查找树,数组中没有重复元素。
为了创建一棵高度最小的树,应该保证根的左子树和右子树节点尽可能的一边多,也就是要保证根应该是数组中的中间元素。在确定了根后,可以将左边的元素依次添加到查找树中,然后再将右边的元素加入到查找树中,这样确实会得到一棵高度最小的查找树,但是时间复杂度是O(nlogn)
。除此之外,也可以继续递归的方式构建这棵树,确定根后,再确定左子树的根,然后确定右子树的根,依次进行递归。
/**
* 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 createBST(nums, 0, nums.size());
}
private:
TreeNode* createBST(const vector<int> &vec, size_t begin, size_t end)
{
if(begin == end) return nullptr;
size_t mid = begin + (end - begin) / 2;
TreeNode* root = new TreeNode(vec[mid]);
root->left = createBST(vec, begin, mid);
root->right = createBST(vec, mid + 1, end);
return root;
}
};