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

🚅【leetcode】108. 将有序数组转换为二叉搜索树

👴刷前碎碎念

今 天 是 五 一 劳 动 节 , 祝 大 家 五 一 快 乐 🎈 🎈 🎈 。 \textcolor{red}{今天是五一劳动节,祝大家五一快乐🎈🎈🎈。} 🎈🎈🎈
今 天 这 道 题 对 我 来 说 是 特 殊 的 , 不 是 因 为 它 的 难 度 是 e a s y , \textcolor{red}{今天这道题对我来说是特殊的,不是因为它的难度是easy,} easy
而 是 因 为 做 完 它 我 的 l e e t c o d e 题 量 就 达 到 ✨ 200 ✨ 啦 ! \textcolor{red}{而是因为做完它我的leetcode题量就达到✨200✨啦!} leetcode200


今天也是这个专栏leetcode题解js诞生的第18天,我写这个专栏的初衷就是用来督促自己好好刷题。其实每天三道题的计划已经进行了31天了,在前12天里也有自己在写题解,但是没有发布出来,而是放在github仓库上,里面也还有之前准备蓝桥杯python组的一些笔记(准备了半个多月,只拿了省二😭),写得比较乱就不放出来了。

在刷题的过程种,我发现在解题前用文字将自己的思路表述出来,然后再敲代码印象非常深刻,坚持下来后发现现在解题时的思路越来越清晰,很多时候都能一次ac,而在以前这是我想都不敢想的,因此这个专栏我会一直写下去。

我始终坚信: 靡 不 有 初 , 鲜 克 有 终 , 厚 积 薄 发 ! \textcolor{green}{靡不有初,鲜克有终,厚积薄发!} 共勉~!

在这里插入图片描述

🚀题目

leetcode原题链接

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

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

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

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

💥leetcode代码模板

/**
 * 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) {

};

🚀思路

在这里插入图片描述
🟡在做过【leetcode】106. 从中序与后序遍历序列构造二叉树这道题我们知道通过中序和后序遍历数组可以构造还原二叉树,其思想就是两个数组相互利用,找到中序数组的切割点作为根节点,切割点左右作为左子树和右子树。


🟢在做完 【leetcode】98. 验证二叉搜索树
这道题后我们知道二叉搜索树的中序遍历数组是一个递增序列。


🟣再来看看题目给的数组,发现正好是升序的,也就是说可以把该数组看成是一棵二叉树的中序遍历数组。但是要还原二叉树只有一个中序数组还不够呀?所以嘛,题目贴心地给了第二个条件:请你将其转换为一棵 高度平衡 二叉搜索树。


🔵高度如何平衡,只要左子树和右子树上的节点尽量一样多就好,这里的左子树和右子树是指所有的左子树和右子树,不仅仅是根节点的。到了这一步思路也就有了:找到升序数组的中间点作为切割点,左边为左子树,右边为右子树,然后左右子树再分别找中间点为切割点,这样层层递归下去,知道数组为空。


🔴递归三部曲:
1️⃣递归函数的参数和返回值:函数的参数就是一个升序数组,返回值就是树的根节点。


2️⃣递归的返回条件是:当数组为空时,返回空节点null


3️⃣单层递归的逻辑:首先找到中间点下标mid,然后利用nums[mid]构造一个树节点作为当前根节点,然后以mid为切割点分出左右数组leftright
递归左右数组得到返回值,作为当前根节点的左右节点。

💻代码

在这里插入图片描述

var sortedArrayToBST = function(nums) {
    if(nums.length === 0) return null
    let mid = Math.floor(nums.length / 2)
    let root = new TreeNode(nums[mid])
    root.left = sortedArrayToBST(nums.slice(0 , mid))
    root.right = sortedArrayToBST(nums.slice(mid + 1))
    return root
};

🍪总结

找到中序数组的切割点作为根节点,切割点左右作为左子树和右子树。
二叉搜索树的中序遍历数组是一个递增序列。
高度如何平衡,只要左子树和右子树上的节点尽量一样多就好。
递归三部曲yyds。

我 是 c o n e r , 请 别 关 注 我 的 专 栏 , 本 系 列 文 章 为 个 人 刷 题 记 录 ( 偷 偷 自 己 卷 🤤 ) : \textcolor{green}{我是coner,请别关注我的专栏,本系列文章为个人刷题记录(偷偷自己卷🤤):} coner🤤leetcode题解js

每 天 早 上 更 新 3 道 l e e t c o d e 题 目 的 j s 题 解 🚀 🚀 🚀 \textcolor{green}{每天早上更新3道leetcode题目的js题解🚀🚀🚀} 3leetcodejs🚀🚀🚀

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端corner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值