1.题目
给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-height-tree-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
要使二叉树的高度最小,那么就应该是AVL平衡二叉树了。
那么就取数组中的中间元素作为树的根节点,递归的进行下去,知道AVL树构造完成。
递归
class Solution
{
public:
TreeNode* sortedArrayToBST(vector<int>& nums)
{
if (nums.empty())
return NULL;
TreeNode* res = new TreeNode(-1);
res -> val = nums[nums.size()/2];
vector<int> leftarray(nums.begin(),nums.begin() + nums.size()/2);//分成左数组
res->left = sortedArrayToBST(leftarray);//构建左子树
vector<int> rightarray(nums.begin() + nums.size()/2+1, nums.end());//分成右数组
res->right = sortedArrayToBST(rightarray);//构建右子树
return res;
}
};
DFS
class Solution
{
public:
TreeNode* sortedArrayToBST(vector<int>& nums)
{
return dfs(0, nums.size() - 1, nums);
}
TreeNode* dfs(int l, int r, vector<int>& nums)
{
if (l > r) return nullptr;
int mid = (l + r) >> 1;
TreeNode* cur = new TreeNode(nums[mid]);
cur->left = dfs(l, mid - 1, nums);
cur->right = dfs(mid + 1, r, nums);
return cur;
}
};