LeetCode系列记录我学习算法的过程。
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
题目
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例:
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
提示:
1 <= nums.length <= 104-104 <= nums[i] <= 104nums按 严格递增 顺序排列
思路
这个题目是要我们根据给定的升序数组来创建一颗二叉树
创建的二叉树的每个节点的左右子树深度要达到高度平衡,差不能超过 1
我们可以通过找中间项切割数组来创建二叉树,因为给定的数组为升序数组,所以不需进行值的判断,只需将切割的左右数组分别创建左右子树即可:
- 首先判断传入的数组长度是否大于
0,否则返回null - 找到数组中间项的下标
- 根据下标将数组切割成
left和right两个数组 - 创建一个根节点
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
};