程序员面试金典 4.2

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;
    }
};
发布了194 篇原创文章 · 获赞 2 · 访问量 7737

猜你喜欢

转载自blog.csdn.net/RayoNicks/article/details/105313668
今日推荐