力扣刷题Days12--104二叉树最大深度(js)

目录

1,题目

2,代码

2.1深度优先遍历--递归思想

2.2-0广度优先搜索--错误版

2.2广度优先搜索

3,学习与总结

3.1二叉树的复习

3.2array常用函数复习


1,题目

给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

2,代码

2.1深度优先遍历--递归思想

求解二叉树最大深度,如果知道左子树的最大深度是l,右子树的最大深度是r,则二叉树的最大深度是max(l,r) + 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 maxDepth = function(root) {
    // 深度优先搜索 递归思想
    if(root === null){
        return 0;
    }else{
        const lefHeight = maxDepth(root.left);
        const rightHeight = maxDepth(root.right);
        return 1+Math.max(lefHeight,rightHeight );
    }
};

2.2-0广度优先搜索--错误版

用于自己检查是否知道哪里错误

/**
 * 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 maxDepth = function(root) {
    // 广度优先搜索
    if(root===null){
        return 0;
    }
    // 用数组来模拟队列
    let queue=[];
    // 将根节点先入队
    queue.push(root);
    let res=0;
    while(queue.length>0){
        // 计算当前层节点的个数
        let size = queue.length;
        res++;
         // 处理当前层的所有节点 
        while(size>0){
            // 队列中节点一一出队
        const node = queue.pop();
        if(node.left != null){
            queue.push(node.left)
        }
        if(node.right != null){
            queue.push(node.right);
        }
        size--;
        }  

    }
    return res;
};

2.2广度优先搜索

逻辑要求,自己可以多次思考写流程,锻炼变量的使用能力;

1.由于javascript没有队列的数据结构,用数组来模拟队列;

2.队列的特点是先进先出,

  • 选择array.shift()和array.push()函数来模拟队列的队头出队  队尾入队;

3.要处理当前层所有节点,将其子孩子一一入队;

  • 使用变量size来实现逻辑判断
/**
 * 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 maxDepth = function(root) {
    // 广度优先搜索
    if (root === null) {
        return 0;
    }
    // 用数组来模拟队列
     let queue = [];
    //  将根节点先加入队列 第一层节点
    queue.push(root);
   
    let ans = 0;

    while (queue.length > 0) {
        let size = queue.length;
        ans++;
        // 处理当前层的所有节点
        while (size > 0) {
            let node = queue.shift();
             // 使用shift()方法从数组前端移除元素,模拟队列的出队操作
            if (node.left !== null) {
                queue.push(node.left); // 将左子节点加入队列
            }
            if (node.right !== null) {
                queue.push(node.right); // 将右子节点加入队列
            }
            size--;
        } 
    }

    return ans;
};

3,学习与总结

3.1二叉树的复习

二叉树的定义、常见的性质及其存储结构(C语言)_n个(n>0)结点的完全二叉树的高度h-CSDN博客

3.2array常用函数复习

  • push()方法用于将一个新元素添加到数组的末尾。在模拟队列的操作中,这相当于将一个元素加入队列的尾部。对于树的广度优先搜索(BFS)来说,当我们遍历到一个节点时,我们将其子节点添加到队列的尾部,以便稍后进行遍历。这确保了遍历按照树的层级顺序进行。

  • shift()方法用于移除数组的第一个元素,并返回被移除的元素。在模拟队列的操作中,这相当于执行出队操作即移除并返回队列的头部元素。在广度优先搜索中,我们需要按顺序处理每个节点,并在处理完毕后将其从队列中移除,以便继续到下一个节点。使用shift()正是为了达到这个目的。

  • pop()方法用于移除数组的最后一个元素,并返回该元素。这相当于栈的“弹出”操作,并不适用于模拟队列的“出队”操作。因为在队列中,元素应该是按照先进先出(FIFO)的顺序被移除的,而pop()实现的是后进先出(LIFO)的顺序,这更符合栈的操作逻辑。


勉励自己:贵在坚持!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决Iterm2升级后遇到“Stashed changes“的问题

<<<<<<< Updated upstream ...... >>>>>>> Stashed changes冲突标记符的代码如题,最近有升级Item2…

鸿蒙原生应用元服务开发-WebGL网页图形库开发接口说明

一、场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理,比如绘制彩色图形等。目前该功能仅支持使用兼容JS的类Web开发范式开发。 二、接口说明 表1 WebGL主要接口列表 本文参考引用HarmonyOS官方开发文档,基于API9。

RStudio更换R语言版本

今天下载R语言用于读取.xlsx文件的readxl包时,RStudio提示该包是使用R-4.3.3版本构建,而我现在使用的是R-4.3.2版本,所以需要升级一下R语言版本,这里先下载最新版本的R语言, 下载地址:The Comprehensive R…

Early if-conversion - 优化阅读笔记

Early if-conversion 用于对于没有很多可预测指令的乱序CPU。目标是消除可能误预测的条件分支。 来自分支两侧的指令都会被推测性地执行,并使用 cmov 指令选择结果。 // SSAIfConv 类在确定可能的情况下,对SSA形式的机器码执行if-conversion。该类不包…

基于JAVA实现自由教学平台设计【附项目源码】分享

基于JAVA实现自由教学平台系统演示 视频:ssm自由教学平台演示录像-CSDN直播基于JAVA实现自由教学平台设计https://live.csdn.net/v/369811 项目源码地址:https://download.csdn.net/download/weixin_43894652/88842681 一、目标 构建一个基于JAVA的网…

第八十天 WAF攻防-漏洞利用HPP污染分块传输垃圾数据

第80天 WAF攻防-漏洞利用&HPP污染&分块传输&垃圾数据 参考点: #将MySQL注入函数分为几类 拆分字符串函数:mid、1eft、1pad等 编码函数:ord、hex、a3ci等 运算函数:*/&^!1 ike rlike reg等 空格替换部…

Python-Pong-Game

我还加了音效,类似于小时候游戏机上的弹球游戏 import os import turtle import pygame#初始化pygame pygame.init()#加载声音文件 bounce_sound pygame.mixer.Sound("bounce.mp3")wn turtle.Screen() wn.title("Pong by ") wn.bgcolor(&qu…

【猫头虎科技解码】探秘Drools语法:规则引擎在实战中的应用️

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

关于yolov8文档的记录,补充一些整理的知识点

2023年由Ultralytics 提供了YOLOv8开源项目。YOLOv8 支持全方位的视觉 AI 任务,包括检测、分割、姿态估计、跟踪和分类。这种多功能性使用户能够在各种应用和领域中利用YOLOv8 的功能。安装yolov8开源项目 pip install githttps://github.com/ultralytics/ultralyti…

SPEL表达式及注入漏洞

SPEL,全称为Spring表达式语言,是一个由 Spring 框架提供的表达式语言。它是一种基于字符串的表达式语言,可以在运行时对对象进行查询和操作。 SpEL 支持在XML和注解配置中使用,它可以在Spring框架的各种组件中使用,如Spring MVC …

7.无重复字符的最长字串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…

Flink技术简介与入门实践

架构简介 Flink 是一个分布式流处理和批处理计算框架,具有高性能、容错性和灵活性。下面是 Flink 的架构概述: JobManager:JobManager 是 Flink 集群的主节点,负责接收和处理用户提交的作业。JobManager 的主要职责包括&#xff1…

【wps】wps与office办公函数储备使用(结合了使用案例 持续更新)

【wps】wps与office办公函数储备使用(结合了使用案例 持续更新) 1、TODAY函数 返回当前电脑系统显示的日期 TODAY函数:表示返回当前电脑系统显示的日期。 公式用法:TODAY() 2、NOW函数 返回当前电脑系统显示的日期和时间 NOW函数:表示返…

案例分析篇11:一篇文章搞定UML设计考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

【linux线程(一)】什么是线程?怎样操作线程?

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux线程 1. 前言2. 什么是线…

阻塞队列学习

1、什么是阻塞队列? 顾名思义,就是支持阻塞的队列,相比于其他的队列,阻塞队列支持以下特性: 队列为空的时候,获取元素的线程会等待队列变为非空。队列为满的时候,存储元素的线程会等待队列可以…

认证授权与JWT

认证授权与JWT 1、认证授权概念介绍1.1 什么是认证1.2 什么是授权 2、权限数据模型3、RBAC权限模型3.1 介绍3.2 基于角色访问控制3.3 基于资源访问控制 4、常见认证方式4.1 Cookie-Session4.2 jwt令牌无状态认证 5 常见技术实现6.Jwt介绍6.1 JWT简介6.2.Jwt组成 7、JWT使用7.1 …

JFMQL100TAI900/JFMQL100T900全国产化 ARM 核心板+扩展板/全国产开发板

TEC100TAI-KIT 是一款基于青龙100TAI 的全国产智能异构计算平台开发套件,该套件包含 1个 100TAI 核心板和 1 个 PCIE 规格的扩展底板。该 套 件 的 核 心 板 集 成 了 100TAI 的 最 小 系 统 , 包 含 一 颗JFMQL100TAI900 片上系统芯片,该单颗…

5、Async await(等待异步)、函数的防抖和节流、模块化

一、Async await(等待异步) Async去声明函数,返回一个promise对象,await在声明的函数里面使用 function fn_1() {return fn_1 } function fn_2() {return new Promise((reslove) > {setTimeout(() > {//因为定时器是异步的 num 10return reslov…

使用gnvm下载nodejs和npm

目录 前言 一、下载gnvm 二、利用gnvm下载nodejs 三、下载对应版本的npm 四、gnvm常用的命令 总结 前言 由于之前下载的版本过低,需要升级版本。但在使用gnvm升级node版本时遇到了一系列的问题,索性就把nodejs全部删除,重新用gnvm在下…
最新文章