LC 108. 将有序数组转换为二叉搜索树
题目描述
这是 LeetCode 上的 108. 将有序数组转换为二叉搜索树 ,难度为 简单。
给你一个整数数组 nums
,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 $1$ 」的二叉树。
示例 1:1
2
3
4
5输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
示例 2:1
2
3
4
5输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:
- $1 <= nums.length <= 10^4$
- $-10^4 <= nums[i] <= 10^4$
nums
按严格递增顺序排列
递归分治
题目给定的 nums
严格有序,为满足构造出来的 BST
整体平衡,我们需要保证每个子树的构造也是平衡的。
一个容易想到的思路:使用 nums
中最靠近中心的位置作为整棵 BST
的根节点,例如下标 $mid = \left \lfloor \frac{l + r}{2} \right \rfloor$ 的位置,确保左右子树节点数量平衡。随后递归构造 nums
中下标范围为 $[0, mid - 1]$ 作为左子树,递归构造 nums
中下标范围为 $[mid + 1, n - 1]$ 作为右子树。
Java 代码:
1 |
|
Python 代码:1
2
3
4
5
6
7
8
9
10
11
12class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
return self.build(nums, 0, len(nums) - 1)
def build(self, nums, l, r):
if l > r:
return None
mid = l + r >> 1
ans = TreeNode(nums[mid])
ans.left = self.build(nums, l, mid - 1)
ans.right = self.build(nums, mid + 1, r)
return ans
C++ 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return build(nums, 0, nums.size() - 1);
}
TreeNode* build(vector<int>& nums, int l, int r) {
if (l > r) return nullptr;
int mid = l + r >> 1;
TreeNode* ans = new TreeNode(nums[mid]);
ans->left = build(nums, l, mid - 1);
ans->right = build(nums, mid + 1, r);
return ans;
}
};
TypeScript 代码:1
2
3
4
5
6
7
8
9
10
11function sortedArrayToBST(nums: number[]): TreeNode | null {
const build = function (nums: number[], l: number, r: number): TreeNode | null {
if (l > r) return null;
const mid = l + r >> 1;
const ans = new TreeNode(nums[mid]);
ans.left = build(nums, l, mid - 1);
ans.right = build(nums, mid + 1, r);
return ans;
}
return build(nums, 0, nums.length - 1);
};
- 时间复杂度:$O(n)$
- 空间复杂度:$O(n)$
最后
这是我们「刷穿 LeetCode」系列文章的第 No.108
篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!