LeetCode热题100JS(44/100)第八天|二叉树的直径|二叉树的层序遍历|将有序数组转换为二叉搜索树|验证二叉树搜索树|二叉搜索树中第K小的元素

news2025/3/15 8:08:50

 543. 二叉树的直径

题目链接:543. 二叉树的直径

难度:简单

刷题状态:1刷

新知识:

解题过程

思考

示例 1:

输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

没什么思路,直接看答案

题解分析

参考题解链接:【视频】彻底掌握直径 DP!从二叉树到一般树!(Python/Java/C++/C/Go/JS/Rust)

详细分析如下

/**
 * 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 {TreeNode} root
 * @return {number}
 */
var diameterOfBinaryTree = function(root) {
    let res=0
    function dfs(node){
        //统计的是路径长度,不是节点个数
        if(!node) return -1
        let llen=dfs(node.left)+1//左子树最大链长+1
        let rlen=dfs(node.right)+1//右子树最大链长+1
        res=Math.max(res,llen+rlen)//两条链拼成路径
        return Math.max(llen,rlen)//当前子数最大链长
    }
    dfs(root)
    return res
};

手搓答案(无非废话版)

/**
 * 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 {TreeNode} root
 * @return {number}
 */
var diameterOfBinaryTree = function(root) {
    let res=0
    function dfs(root){
        if(!root) return -1
        let llen=dfs(root.left)+1
        let rlen=dfs(root.right)+1
        res=Math.max(res,llen+rlen)
        return Math.max(llen,rlen)
    }
    dfs(root)
    return res
};

总结

 注意这里返回的是//当前子数最大链长return Math.max(llen,rlen)

 102. 二叉树的层序遍历

题目链接:​​​​​​​​​​​​​​102. 二叉树的层序遍历

难度:中等

刷题状态:2刷

新知识:

- `[...map.values()]`    // 返回按深度排序的节点值数组

解题过程

思考

示例 1:

输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

放下1刷的过程在题解,虽然写过但不记得咋写的了,直接看答案吧

题解分析

参考题解链接:​​​​​​​二叉树的层序遍历

详细分析如下

/**
 * 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 {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    let map=new Map()
    function dfs(node,depth){
        if(!node) return depth
        let leftDepth=dfs(node.left,depth+1)
        let rightDepth=dfs(node.right,depth+1)
        // console.log(node.val,leftDepth)
        if(!map.has(leftDepth)){
            map.set(leftDepth,[])
        }
        map.get(leftDepth).push(node.val)
        return depth
    }
    dfs(root,-1)
    let res=Array.from(map.entries()).sort((a,b)=>a[0]-b[0]).map(([i,val])=>val)
    return res
};

手搓答案(无非废话版)

/**
 * 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 {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    let map=new Map()
    function dfs(node,depth){
        if(!node) return depth
        if(!map.has(depth)) map.set(depth,[])
        map.get(depth).push(node.val)
        dfs(node.left,depth+1)
        dfs(node.right,depth+1)
        return depth
    }
    dfs(root,0)
    return [...map.values()]
};

总结

 题解是逆向填入的的,我觉得手撕的正向填入好理解一点

 ​​​​​​​​​​​​​​​​

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

题目链接:​​​​​​​​​​​​​​​​​​​​​

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

难度:简单

刷题状态:1刷

新知识:

解题过程

思考

示例 1:

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

平衡二叉树 是指该树所有节点的左右子树的高度相差不超过 1。

不会,直接看答案

题解分析

参考题解链接:​​​​​​​二叉树的层序遍历

详细分析如下

/**
 * 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) {
    function dfs(lower,higher){
        if(lower>higher) return null
        //找中间的
        let mid=lower+Math.floor((higher-lower)/2)
        let root=new TreeNode(nums[mid])
        //连接左子树
        root.left=dfs(lower,mid-1)
        //连接右子树
        root.right=dfs(mid+1,higher)
        return root
    }
    return dfs(0,nums.length-1)
};

手搓答案(无非废话版)

/**
 * 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) {
    function dfs(lower,higher){
        if(lower>higher) return null
        let mid=lower+Math.floor((higher-lower)/2)
        let root=new TreeNode(nums[mid])
        root.left=dfs(lower,mid-1)
        root.right=dfs(mid+1,higher)
        return root
    }
    return dfs(0,nums.length-1)
};

总结

 递归解法,感觉二叉树的都是套路,就是得多练,找到套路

 ​​​​​​​98. 验证二叉搜索树

题目链接:​​​​​​​​​​​​​​98. 验证二叉搜索树

难度:中等

刷题状态:2刷

新知识:

解题过程

思考

示例 1:

输入:root = [2,1,3]
输出:true

注意是左子树,右子树,不行,实在是忘了,直接看答案吧,这么基础的题!!!!

放下1刷过程在题解

题解分析

参考题解链接:​​​​​​​【视频】前序中序后序,三种方法,一个视频讲透!(Python/Java/C++/Go/JS)

详细分析如下

/**
 * 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 {TreeNode} root
 * @return {boolean}
 */
// var isValidBST = function(root,left=-Infinity,right=Infinity) {
//     if(!root){
//         return true
//     }
//     let l=isValidBST(root.left,left,root.val)
//     let r=isValidBST(root.right,root.val,right)
//     return left<root.val&&root.val<right&&l&&r
// };

// var isValidBST = function(root) {
//     let pre=-Infinity
//     function dfs(node){
//         if(!node){
//             return true
//         }
//         console.log('node',node.val)
//         if(!dfs(node.left)||node.val<=pre){
//             return false
//         }
//         pre=node.val
//         return dfs(node.right)
//     }
//     return dfs(root)
// };

var isValidBST =function(root){
    function dfs(node){
        if(!node) return [Infinity,-Infinity]
        console.log(node.val)
        let [lMin,lMax]=dfs(node.left)
        let [rMin,rMax]=dfs(node.right)
        let x=node.val
        if(x<lMax||x>rMin) return [-Infinity,Infinity]
        return [Math.min(lMin,x),Math.max(rMax,x)]
    }
    let a=dfs(root)[1]
    return a!=Infinity
}

手搓答案(无非废话版)

/**
 * 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 {TreeNode} root
 * @return {boolean}
 */
var isValidBST =function(root){
    // //前序遍历
    // function dfs(node,left=-Infinity,right=Infinity){
    //     if(!node) return true
    //     let l=dfs(node.left,left,node.val)
    //     let r=dfs(node.right,node.val,right)
    //     return left<node.val&&node.val<right&&l&&r
    // }
    // return dfs(root)

    //中序遍历
    //(中序遍历应该是严格递增的)
    //这个变量用于记录中序遍历过程中上一个访问的节点的值,以便检查当前节点值是否大于上一个节点值,
    // let pre=-Infinity
    // function dfs(node){
    //     if(!node) return true
    //     if(!dfs(node.left)||node.val<=pre) return false
    //     pre=node.val
    //     return dfs(node.right)
    // }
    // return dfs(root)

    //后序遍历
    function dfs(node){
        //确保下一次的比较
        if(!node) return [Infinity,-Infinity]
        let [lMin,lMax]=dfs(node.left)
        let [rMin,rMax]=dfs(node.right)
        let x=node.val
        //说明已经不是二叉树了
        if(x<=lMax||x>=rMin) return [-Infinity, Infinity]
        return [Math.min(lMin,x),Math.max(x,rMax)]
    }
    return dfs(root)[1]==Infinity?false:true
}

总结

 经典题目!!!三种方法都要记得!我觉得中序的最好理解

 ​​​​​​​230. 二叉搜索树中第 K 小的元素

题目链接:​​​​​​​230. 二叉搜索树中第 K 小的元素

难度:中等

刷题状态:2刷

新知识:

解题过程

思考

示例 1:

输入:root = [3,1,4,null,2], k = 1
输出:1

放下1刷过程在题解

题解分析

参考题解链接:​​​​​​​二叉搜索树中第K小的元素​​​​​​​

详细分析如下

/**
 * 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 {TreeNode} root
 * @param {number} k
 * @return {number}
 */
var kthSmallest = function(root, k) {
    let a=[]
    function dfs(node){
        if(!node) return 
        dfs(node.left)
        if(a.length<k){
            a.push(node.val)
        }
        dfs(node.right)
    }
    dfs(root)
    return a[a.length-1]
};

手搓答案(无非废话版)

/**
 * 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 {TreeNode} root
 * @param {number} k
 * @return {number}
 */
var kthSmallest = function(root, k) {
    let nums=[]
    function dfs(node){
        if(!node) return 
        dfs(node.left)
        if(nums.length<k) nums.push(node.val)
        dfs(node.right)
    }
    dfs(root)
    return nums[k-1]
};

总结

 还可以优化~多设置一个变量,大家想想吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2311197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣刷题DAY6(滑动窗口/中等+栈/简单、中等)

一、滑动窗口 找到字符串中所有字母异位词 方法一&#xff1a;哈希表 class Solution { public:vector<int> findAnagrams(string s, string p) {vector<int> ans;unordered_map<char, int> target;for (int i 0; i < p.size(); i) {target[p[i]];}in…

虚拟机 | Ubuntu图形化系统: open-vm-tools安装失败以及实现文件拖放

系列文章目录 虚拟机 | Ubuntu 安装流程以及界面太小问题解决 文章目录 系列文章目录虚拟机 | Ubuntu 安装流程以及界面太小问题解决 前言一、VMware Tools 和 open-vm-tools 是什么1、VMware Tools2、open-vm-tools 二、推荐使用open-vm-tools&#xff08;简单&#xff09;1、…

【DeepSeek】Ubuntu快速部署DeepSeek(Ollama方式)

文章目录 人人都该学习的DeepSeekDeepSeek不同版本功能差异DeepSeek与硬件直接的关系DeepSeek系统兼容性部署方式选择部署步骤&#xff08;Ollama方式&#xff09;1.选定适合的deepseek版本2.环境准备3.安装Ollama4.部署deepseek5.测试使用 人人都该学习的DeepSeek DeepSeek 作…

升级到Android Studio 2024.2.2 版本遇到的坑

一、上来就编译报错&#xff0c;大概率是因为选择了替换安装&#xff0c;本地配置文件出错 找到本地当前版本的配置文件&#xff0c;删掉&#xff0c;重启studio就好了&#xff1a; 1、打开终端 2、“cd /Users/用户名/Library/Application\ Support/Google” //到Google目录 …

【ESP-ADF】在 VSCode 安装 ESP-ADF 注意事项

1.检查网络 如果您在中国大陆安装&#xff0c;请使用魔法上网&#xff0c;避免无法 clone ESP-ADF 仓库。 2.VSCode 安装 ESP-ADF 在 VSCode 左侧活动栏选择 ESP-IDF:explorer&#xff0c;展开 advanced 并点击 Install ESP-ADF 然后会出现选择 ESP-ADF 安装目录。 如果出现…

我的两个医学数据分析技术思路

我的两个医学数据分析技术思路 从临床上获得的或者公共数据库数据这种属于观察性研究&#xff0c;是对临床诊疗过程中自然产生的数据进行分析而获得疾病发生发展的规律等研究成果。再细分&#xff0c;可以分为独立危险因素鉴定和预测模型构建两种。 独立危险因素鉴定是一直以…

FPGA-DE2115开发板实现4位全加器、3-8译码器。

文章目录 一、安装quartus二、4位全加器三、3-8译码器&#xff08;8段数码管&#xff09;四、参考文章 一、安装quartus 安装quartus参考文章&#xff1a;Quartus Prime 18.0与ModelSim的安装 Quartus II 18.0安装教程&#xff08;非常详细&#xff09;从零基础入门到精通&…

Pytorch xpu环境配置 Pytorch使用Intel集成显卡

1、硬件集显要为Intel ARC并安装正确驱动 2、安装Intel oneAPI Base Toolkit &#xff08;https://www.intel.cn/content/www/cn/zh/developer/tools/oneapi/base-toolkit-download.html&#xff09;安装后大约20G左右&#xff0c;注意安装路径 3、安装Visual Studio Build To…

uploadlabs通关思路

目录 靶场准备 复现 pass-01 代码审计 执行逻辑 文件上传 方法一&#xff1a;直接修改或删除js脚本 方法二&#xff1a;修改文件后缀 pass-02 代码审计 文件上传 1. 思路 2. 实操 pass-03 代码审计 过程&#xff1a; 文件上传 pass-04 代码审计 文件上传 p…

优选算法的智慧之光:滑动窗口专题(二)

专栏&#xff1a;算法的魔法世界​​​​​​ 个人主页&#xff1a;手握风云 目录 一、例题讲解 1.1. 最大连续1的个数 III 1.2. 找到字符串中所有字母异位词 1.3. 串联所有单词的子串 1.4. 最小覆盖子串 一、例题讲解 1.1. 最大连续1的个数 III 题目要求是二进制数组&am…

【蓝桥杯单片机】第十二届省赛

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 由Y5C控制 2.编写LED函数&#xff08;led.c&#xff09; void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器…

剑指 Offer II 047. 二叉树剪枝

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20047.%20%E4%BA%8C%E5%8F%89%E6%A0%91%E5%89%AA%E6%9E%9D/README.md 剑指 Offer II 047. 二叉树剪枝 题目描述 给定一个二叉树 根节点 root &#xff0c;树的每…

第5章:vuex

第5章&#xff1a;vuex 1 求和案例 纯vue版2 vuex工作原理图3 vuex案例3.1 搭建vuex环境错误写法正确写法 3.2 求和案例vuex版细节分析源代码 4 getters配置项4.1 细节4.2 源代码 5 mapState与mapGetters5.1 总结5.2 细节分析5.3 源代码 6 mapActions与mapMutations6.1 总结6.2…

视觉在协作机器人上的场景应用

看了UR、ABB等协作机器人公司的一些视觉方面的应用&#xff0c;总结大概有下面几个方面。 1.工业制造领域 3C 产品生产 外观检测&#xff1a;可精确检测电子元件的划痕、污渍、凹陷等外观缺陷&#xff0c;如手机屏幕的微小划痕、芯片表面的瑕疵等&#xff0c;确保产品高质量&a…

MyBatis-Plus开发流程:Spring Boot + MyBatis-Plus 实现对 book_tab 表的增删改查及Redis缓存

前言 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;旨在简化开发、减少工作量。本文将介绍如何使用 Spring Boot 集成 MyBatis-Plus 来操作数据库&#xff0c;并结合 Redis 实现数据的缓存功能。 1项目搭建 1.1 创建 Spring Boot 项目 可以通过 Spring Initializr 快…

从开源大模型工具Ollama存在安全隐患思考企业级大模型应用如何严守安全红线

近日&#xff0c;国家网络安全通报中心通报大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患&#xff0c;引发了广泛关注。Ollama作为一款开源的大模型管理工具&#xff0c;在为用户提供便捷的同时&#xff0c;却因缺乏有效的安全管控机制&#xff0c;存在数据泄露…

通过Docker搭个游戏——疯狂大陆(Pkland)

最近在研究我的服务器&#xff0c;在服务器上搭了很多docker的项目&#xff0c;然后找着找着发现一个能用Docker配置环境的游戏叫Pkland。 项目地址&#xff1a;GitHub - popkarthb/pkland: 疯狂大陆是一款多人在线的战略游戏。 游戏操作简捷,您仅需要使用浏览器就可以在任何时…

hive之LEAD 函数详解

1. 函数概述 LEAD 是 Hive 中的窗口函数&#xff0c;用于获取当前行之后指定偏移量处的行的值。常用于分析时间序列数据、计算相邻记录的差异或预测趋势。 2. 语法 LEAD(column, offset, default) OVER ([PARTITION BY partition_column] [ORDER BY order_column [ASC|DESC]…

springboot429-基于springboot的教务管理系统(源码+数据库+纯前后端分离+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…

linux磁盘非lvm分区

linux磁盘非lvm分区 类似于windows划分C盘、D盘&#xff0c;并且不需要多个磁盘空间合一 图形化直接分区 通过gparted 这个提供直观的图形化分区&#xff0c;类似windows的磁盘管理工具 下载方式&#xff1a; 乌班图/debian系列&#xff1a; sudo apt install gparted红帽…