最小高度树

题目描述

来源于 https://leetcode-cn.com/

给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。

示例:<pre>给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

0
/ &#92
-3 9
/ /
-10 5
</pre>

解法:

因为是排序的数组,因此数组的中间位置的元素一定是二叉搜索树的根节点。数组左半部分构成左子树,右半部分构成右子树。如此递归地建树,就可以构建一棵叶子节点的高度差最大为 1 的二叉搜索树。满二叉树,高度自然最小。

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return sortedArrayToBST(nums, 0, nums.size());
    }

private:
    TreeNode* sortedArrayToBST(vector<int>& nums, int lo, int hi) {
        if(hi == lo) return nullptr;

        int mid = lo + (hi - lo) / 2;
        
        auto *root = new TreeNode(nums[mid]);
        root->left = sortedArrayToBST(nums, lo, mid);
        root->right = sortedArrayToBST(nums, mid+1, hi);

        return root;
    }
};