LeetCode-108-将有序数组转换为二叉搜索树

题目

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。

示例 1:

img
1
2
3
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

img
1
2
3
输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3][3,1] 都是高度平衡二叉搜索树。

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums严格递增 顺序排列

题解

其实能感觉到刷题有用,至少可以写出来大概的代码了。

BST的中序遍历是升序的,所以这题和根据中序遍历恢复二叉树是一样的。所以用升序序列的任何一个元素作为根节点,左边的序列构建左子树,右边的序列构建右子树,这样就可以得到一棵二叉树。因为题目要求平衡,所以选择中间位置的节点作为根节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return dfs(nums, 0, nums.length - 1);
}

private TreeNode dfs(int[] nums, int lo, int hi) {
// 如果li > hi说明越界需要返回
if (lo > hi) {
return null;
}
// 以升序数组的中间元素作为根节点 root。每次构建的时候都用中间元素作为根节点
int mid = lo + (hi - lo) / 2;
TreeNode root = new TreeNode(nums[mid]);
// 递归的构建 root 的左子树与右子树。
root.left = dfs(nums, lo, mid - 1);
root.right = dfs(nums, mid + 1, hi);
return root;
}
}

LeetCode-108-将有序数组转换为二叉搜索树
https://excelius.xyz/leetcode-108-将有序数组转换为二叉搜索树/
作者
Ther
发布于
2024年8月9日
许可协议