跳到主要内容

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

题目描述

平衡二叉搜索树(Balanced Binary Search Tree)是一种特殊的二叉搜索树,它满足以下两个条件:

  • 它是一棵二叉搜索树。意味着树中的任何节点,其左子树中的所有节点的值都小于该节点的值,其右子树中的所有节点的值都大于该节点的值。
  • 它是一棵平衡树。这意味着对于树中的任何节点,其左子树和右子树的高度差不超过 1。

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

示例 1

示例 1

输入nums = [-10,-3,0,5,9]

输出[0,-3,9,-10,null,5]

解释[0,-10,5,null,-3,null,9] 也将被视为正确答案。

示例 1

示例 2

示例 2

输入nums = [1,3]

输出[3,1]

解释[1,null,3][3,1] 都是高度平衡二叉搜索树。

提示

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

出处LeetCode

解法一:递归

思路

递归遍历数组,每次取中间元素作为根节点,左右子树分别递归构建。

实现

function sortedArrayToBST(nums: number[]): TreeNode | null {
const build = (left: number, right: number): TreeNode | null => {
if (left > right) {
return null;
}
const mid = left + Math.floor((right - left) / 2);
const root = new TreeNode(nums[mid]);
root.left = build(left, mid - 1);
root.right = build(mid + 1, right);
return root;
};
return build(0, nums.length - 1);
}

复杂度分析

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(logn)O(\log n)

解法二:迭代

思路

使用栈模拟递归过程,每次取中间元素作为根节点,左右子树分别入栈。

实现

function sortedArrayToBST(nums: number[]): TreeNode | null {
const root = new TreeNode(0);
const stack = [[root, 0, nums.length - 1]];
while (stack.length) {
const [node, left, right] = stack.pop()!;
const mid = left + Math.floor((right - left) / 2);
node.val = nums[mid];
if (left <= mid - 1) {
node.left = new TreeNode(0);
stack.push([node.left, left, mid - 1]);
}
if (mid + 1 <= right) {
node.right = new TreeNode(0);
stack.push([node.right, mid + 1, right]);
}
}
return root;
}

复杂度分析

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(n)O(n)