108. 将有序数组转换为二叉搜索树
一、题目分析
题意:根据升序数组,恢复一棵高度平衡的 BST。
分析:BST 的中序遍历是升序的,因此本题等同于根据中序遍历的序列恢复二叉搜索树。因此我们可以以升序序列中的任一个元素作为根节点,以该元素左边的升序序列构建左子树,以该元素右边的升序序列构建右子树,这样得到的树就是一棵二叉搜索树啦~ 又因为本题要求高度平衡,因此我们需要选择升序序列的中间元素作为根节点奥~
二、具体分析
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return helper(nums, 0, nums.length - 1);
}
private TreeNode helper(int[] nums, int lo, int hi) {
if (lo > hi) return null;
int mid = (lo + hi) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = helper(nums, lo, mid - 1);
root.right = helper(nums, mid + 1, hi);
return root;
}
}
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
return self.helper(nums, 0, len(nums) - 1)
def helper(self, nums, lo: int, hi: int) -> TreeNode:
if lo > hi: return None
mid = (lo + hi) // 2
root = TreeNode(nums[mid])
root.left = self.helper(nums, lo, mid - 1)
root.right = self.helper(nums, mid + 1, hi)
return root