Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode-最小高度树
给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
二、思路分析:
思路一: 容易证明当左右高度相同时候,高度最小
因为为升序,且二叉搜索树必须满足左小右大,所以取中间数作为根节点能构造出高度最小的数
选完根节点,数组被分成两部分
分别组成根节点的左右子树,由于两个子树互不影响,且其高度影响最终树的高度,所以应该使得两颗子树高度都最小
-
问题规模小时(l==r): return new TreeNode(nums[l]);
-
问题规模大时:
1.取出中间节点作为根节点
2.构成高度最小的二叉搜索树做左子树
3.构成高度最小的二叉搜索树做右子树
思路二: sortedArrayToBST方法是传入一个数组
取数组中间的数建立根节点root
以中间为分界,将左边的子数组和右边的子数组分别传入sortedArrayToBST进行递归
返回的是左子树和右子树的根节点,令其等于root.left和root.right即可:
三、AC 代码:
思路一:
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return genBST(nums, 0, nums.length - 1);
}
public static TreeNode genBST(int[] nums, int start, int end) {
if (start > end) return null;
int midValue = start + (end - start) / 2;
TreeNode rootNode = new TreeNode(nums[midValue]);
rootNode.left = genBST(nums, start, midValue - 1);
rootNode.right = genBST(nums, midValue + 1, end);
return rootNode;
}
}
思路二:
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if (nums.length == 0) return null;
TreeNode result = new TreeNode(nums[nums.length / 2]);
result.left = sortedArrayToBST(Arrays.copyOfRange(nums, 0, nums.length / 2));
result.right = sortedArrayToBST(Arrays.copyOfRange(nums, nums.length / 2 + 1, nums.length));
return result;
}
}