LeetCode108、将有序数组转换为二叉搜索树

79 阅读1分钟

LeetCode 系列记录我学习算法的过程。

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

题目

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

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例:

image.png

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

image.png

提示:

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

思路

这个题目是要我们根据给定的升序数组来创建一颗二叉树

创建的二叉树的每个节点的左右子树深度要达到高度平衡,差不能超过 1

我们可以通过找中间项切割数组来创建二叉树,因为给定的数组为升序数组,所以不需进行值的判断,只需将切割的左右数组分别创建左右子树即可:

  • 首先判断传入的数组长度是否大于 0,否则返回 null
  • 找到数组中间项的下标
  • 根据下标将数组切割成 leftright 两个数组
  • 创建一个根节点 root,值为数组中间项的值
  • 判断 left 数组长度是否大于 0,大于则递归调用当前函数传入 left 数组,返回值赋值给根节点的左子树
  • right 操作同上,为根节点右子树
  • 最后返回根节点即可

代码实现

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number[]} nums
 * @return {TreeNode}
 */
var sortedArrayToBST = function(nums) {
    // 数组为空,返回null
    if (nums.length < 1) return null
    // 找到中间下标
    let idx = Math.floor(nums.length / 2)
    // 根据中间项切割数组成左右两个数组
    let left = nums.slice(0, idx)
    let right = nums.slice(idx + 1)
    // 创建一个根节点,值为中间项
    let root = new TreeNode(nums[idx])
    // 左数组长度大于 0,根节点左子树递归创建
    if (left.length > 0) {
        root.left = sortedArrayToBST(left)
    }
    // 右子树操作同上
    if (right.length > 0) {
        root.right = sortedArrayToBST(right)
    }
    // 返回根节点
    return root
}; 

image.png