算法篇——层序遍历大集合(js版)

news2024/12/24 23:59:14

102.二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

链接:力扣

  

var levelOrder = function(root) {
    var res = [], queue = [];
    if(!root) return res;
    // 队列先进先出,层遍历的逻辑
    queue.push(root);
    while(queue.length) {
        // 记录当前层级节点数
        let len = queue.length;
        //存放每一层的节点
        let curNode = [];
        for(let i = 0;i < len; i++) {
            let node = queue.shift();
            curNode.push(node.val);
            // 存放当前层下一层的节点
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
        }
        //把每一层的结果放到结果数组
        res.push(curNode);
    }
    return res;
};

107.二叉树的层序遍历Ⅱ

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

链接:力扣

var levelOrderBottom = function(root) {
    var res = [], queue = [];
    if(!root) return res;
    // 队列先进先出,层遍历的逻辑
    queue.push(root);
    while(queue.length) {
        // 记录当前层级节点数
        let len = queue.length;
        //存放每一层的节点
        let curNode = [];
        for(let i = 0;i < len; i++) {
            let node = queue.shift();
            curNode.push(node.val);
            // 存放当前层下一层的节点
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
        }
        //把每一层的结果放到结果数组
        res.push(curNode);
    }
    return res.reverse();
};

637.二叉树的层平均值

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 

链接:力扣

  

var averageOfLevels = function(root) {
    // res:层序遍历结果数组,avgRes:平均值结果数组,nodeRes:每层节点存储数组
    var res = [], queue = [], avgRes = [], nodeRes= [];
    // 队列先进先出,层遍历的逻辑
    queue.push(root);
    while(queue.length) {
        // 记录当前层级节点数
        let len = queue.length;
        //存放每一层的节点
        let curNode = [];
        for(let i = 0;i < len; i++) {
            let node = queue.shift();
            curNode.push(node.val);
            // 存放当前层下一层的节点
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
        }
        //把每一层的结果放到结果数组
        res.push(curNode);
        nodeRes = res[res.length-1];
        var sum = 0
        for(var i = 0; i < nodeRes.length; i++) {
            sum += nodeRes[i]; 
        }
        avgRes.push(sum/nodeRes.length);
    }
    return avgRes;
};

199.二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

链接:力扣

var rightSideView = function(root) {
    var res = [], queue = [];
    if(!root) return res;
    // 队列先进先出,层遍历的逻辑
    queue.push(root);
    while(queue.length) {
        // 记录当前层级节点数
        let len = queue.length;
        //存放每一层的节点
        let curNode = [];
        for(let i = 0;i < len; i++) {
            let node = queue.shift();
            curNode.push(node.val);
            // 存放当前层下一层的节点
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
        }
        //把每一层的结果放到结果数组
        res.push(curNode);
    }
    var rightRes = [];
    for(var i = 0; i < res.length; i++) {
        rightRes.push(res[i][res[i].length-1])
    }
    return rightRes;
};

429.N叉树的层序遍历

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

链接:力扣

var levelOrder = function(root) {
    var res = [], queue = [];
    if(!root) return res;
    // 队列先进先出,层遍历的逻辑
    queue.push(root);
    while(queue.length) {
        // 记录当前层级节点数
        let len = queue.length;
        //存放每一层的节点
        let curNode = [];
        while(len--) {
            var cur = queue.shift();
            curNode.push(cur.val);
            // n叉树不定的节点数,所有不是left,right
            for(var i of cur.children) {
                i && queue.push(i);
            }
        }
        //把每一层的结果放到结果数组
        res.push(curNode);
    }
    return res;
};

515.在每个树行中找最大值

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

链接:力扣

var largestValues = function(root) {
    var res = [], queue = [], maxRes = [];
    // 队列先进先出,层遍历的逻辑
    queue.push(root);
    while(queue.length && root) {
        // 记录当前层级节点数
        let len = queue.length;
        //存放每一层的节点
        let curNode = [];
        for(let i = 0;i < len; i++) {
            let node = queue.shift();
            curNode.push(node.val);
            // 存放当前层下一层的节点
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
        }
        //把每一层的结果放到结果数组
        res.push(curNode);
        nodeRes = res[res.length-1];
        var max = nodeRes[0];
        for(var i = 0; i < nodeRes.length; i++) {
            if(max < nodeRes[i]) {
                max = nodeRes[i]
            }
        }
        maxRes.push(max)
    }
    return maxRes;
};

116.填充每个节点的下一个右侧节点指针 

        给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。

二叉树定义如下:

struct Node {
    int val;
    Node *left;
    Node *right;
    Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。
链接:https://leetcode.cn/problems/populating-next-right-pointers-in-each-node

 

注:单层遍历时记录本层的头部节点,遍历时让前一个节点指向当前节点

var connect = function(root) {
    if(root) {
        var lcode = root;
        while(lcode.left) {
            var head = lcode;
            while(head) {
                head.left.next = head.right;
                if(head.next) {
                    head.right.next = head.next.left;
                }
                head = head.next;
            }
            lcode = lcode.left;
        }
    }
    return root;
};

var connect = function(root) {
    if(root) {
        var queue = [root];
        while(queue.length) {
           var len = queue.length;
           for(var i = 0; i < len; i++) {
               var cur = queue.shift();
               if(i < len-1) cur.next = queue[0];
               cur.left && queue.push(cur.left);
               cur.right && queue.push(cur.right);
           }
        }
        return root;
    }
    return root;
};

117.填充每个节点的下一个右侧节点指针II

给定一个二叉树:

struct Node {
    int val;
    Node *left;
    Node *right;
    Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

初始状态下,所有 next 指针都被设置为 NULL 。
链接:https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii

var connect = function(root) {
    if(root) {
        var queue = [root];
        while(queue.length) {
           var len = queue.length;
           for(var i = 0; i < len; i++) {
               var cur = queue.shift();
               if(i < len-1) cur.next = queue[0];
               cur.left && queue.push(cur.left);
               cur.right && queue.push(cur.right);
           }
        }
        return root;
    }
    return root;
};

104.二叉树的最大深度

给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3, 9, 20, null, null, 15, 7],

     3
    / \
  9  20
      /  \
   15   7

返回它的最大深度 3 。
链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree 

var maxDepth = function(root) {
    if(!root) return 0;
    var res = [], queue = [];
    queue.push(root);
    while(queue.length) {
        let len = queue.length;
        let curNode = [];
        for(let i = 0;i < len; ++i) {
            let node = queue.shift();
            curNode.push(node.val);
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
        }
    }
    return res.length;
};

111.二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

链接:力扣

var minDepth = function(root) {
    if(!root) return 0;
    var queue = [root];
    var min = 0;
    while(queue.length) {
        var len = queue.length;
        min++;
        for(var i = 0; i < len; i++) {
            var cur = queue.shift();
            // 没有左右孩子,说明此时是叶子节点,返回min
            if(!cur.left && !cur.right) return min;
            cur.left && queue.push(cur.left);
            cur.right && queue.push(cur.right);
        }
    }
    return min;
};

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

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

相关文章

海斯坦普Gestamp EDI 需求分析

海斯坦普Gestamp&#xff08;以下简称&#xff1a;Gestamp&#xff09;是一家总部位于西班牙的全球性汽车零部件制造商&#xff0c;目前在全球23个国家拥有超过100家工厂。Gestamp的业务涵盖了车身、底盘和机电系统等多个领域&#xff0c;其产品范围包括钣金、车身结构件、车轮…

非极大值抑制详细原理(NMS含代码及详细注释)

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect 个…

配置vscode arcpy环境 基于ArcGIS的python

最近可能要用到arcpy&#xff0c;我以前这是知道有这个东西&#xff0c;但是没用过&#xff0c;今天正好记录下利用vsCode编译器&#xff0c;python开发来配置arcpy环境。 1.安装ArcGIS desktop 2.下载安装vscode 上面的两步没啥可说的&#xff0c;很简单&#xff0c;我要说…

ArcGIS、ENVI、InVEST、FRAGSTATS多技术融合提升环境、生态、水文、土地、土壤、农业、大气领域应用

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析能力与项目科研水平 点击查看原文 一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 …

性能优化之-更高效的数据渲染

前言&#xff1a;中心思想还是让请求的资源得到更快响应的方法&#xff0c;比如压缩资源&#xff0c;减少数据量的大小&#xff0c;缓存数据以减少请求数量&#xff0c;http/2让网络传输变得更快这些&#xff0c;下面就让我们来看看浏览器是如何解析这些数据&#xff0c;最终又…

数据结构——红黑树

红黑树 概念与性质树节点的定义插入红黑树的验证红黑树与AVL树的对比 概念与性质 概念&#xff1a; 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色…

数字IC设计——功耗分析

一、概述 芯片的整体功耗很难通过简单的电流&#xff0c;电压或者电阻值的的相乘来计算。其原因在于&#xff0c;由于芯片作为具有复杂功能的器件&#xff0c;其功耗会根据其不同时段的不同行为&#xff0c;不同的外部条件而发生很大的变化。 1.1 功耗的分类 数字IC芯片的功…

Three.js+TypeScript+Webpack学习记录(二)

使用环境参考 Node.js v16.19.1 正文 跟着文档画个线 看看 Three 的官方文档&#xff0c;起步 -> 画线 -> 没了&#xff1f;&#xff01;&#xff01; 不管怎么说&#xff0c;先画个线吧。 import * as THREE from threeconst scene new THREE.Scene() const camer…

HummerRisk V1.0 开发手册(微服务版)

HummerRisk 是开源的云原生安全平台&#xff0c;以非侵入的方式解决云原生环境的安全和治理问题。核心能力包括混合云的安全治理和容器云安全检测。 本文将介绍HummerRisk 1.0以后的开发准备工作。 v1.0.0 以后的版本&#xff0c;代码在 dev 分支。欢迎大家在 dev 开发分支提…

多通道振弦传感器无线采集仪 数字传感器起始通道分配

多通道振弦传感器无线采集仪 数字传感器起始通道分配 寄存器 DS_CHNUM(299)用于设置读取到的数字传感器数据从哪个通道开始占用&#xff0c;默认为 1。 单个数字传感器占用的通道数量与具体的传感器类型有关&#xff0c;例如&#xff1a;每个激光测距仪会占用 1 个通道&#xf…

Linux Shell 实现一键部署二进制go+caddy+filebrowser

filebrowser filebrowser 是一个使用go语言编写的软件&#xff0c;功能是可以通过浏览器对服务器上的文件进行管理。可以是修改文件&#xff0c;或者是添加删除文件&#xff0c;甚至可以分享文件&#xff0c;是一个很棒的文件管理器&#xff0c;你甚至可以当成一个网盘来使用。…

HCIE Datacom认证学什么内容

什么HCIE 什么是HCIE&#xff1f;HCIE的全称是Huawei Certified ICT Expert&#xff08;华为认证ICT技术专家&#xff09;。 华为认证是行业中最严谨的认证&#xff0c;含金量与行业认可度都较高。在众多的IT行业认证中&#xff0c;HCIE被誉为“网络界的博士”。 华为认证HCI…

深度学习 - 41.Word2vec、EGES 负采样实现 By Keras

目录 一.引言 二.实现思路 1.样本构建 2.Word2vec 架构 3.EGES 架构 4.基于 NEG 的 Word2vec 架构 三.Keras 实现 Word2vec 1.样本构建 2.模型构建 3.向量获取 四.keras 实现 EGES 1.样本构建 2.模型构建 3.Dot Layer 详解 3.1 init 方法 3.2 call 方法 3.3 完…

4月18号软件更新资讯合集

ModStartCMS v6.2.0&#xff0c;VIP 权益配置功能、界面 UI 优化升级 ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.…

4月19号软件更新资讯合集....

JavaWeb 微服务前后端分离 EurekaEleVue 版 v1.5.0 发布 v1.5.0 更新如下&#xff1a; 1、解决 token 过期无法跳转至登录页的问题&#xff1b; 2、授权服务进行重构与优化&#xff1b; 一款 Java 语言基于 SpringCloud、SpringSecurity、OAuth2、Eureka、Vue、ElementUI、…

Docker实战笔记1-基础

转载请标明出处&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/130181636 本文出自【赵彦军的博客】 文章目录 官网下载安装安装Docker 镜像镜像分层存储 容器常用命令docker infodocker imagesdocker versiondocker ps &#xff1a;查看容器docker ps -a查看容…

如何检查设置的IP是否有效?Storm proxies动态代理IP好用吗?

检查设置的IP是否有效可以通过以下几种方式&#xff1a; 发起网络请求&#xff1a;可以使用HTTP客户端库&#xff08;例如Python的Requests库&#xff09;或者命令行工具&#xff08;例如curl&#xff09;来发起网络请求&#xff0c;使用设置的IP作为代理IP&#xff0c;然后查看…

读SQL进阶教程笔记12_地址与三值逻辑

1. SQL和数据库都在极力提升数据在表现层的抽象度&#xff0c;以及对用户隐藏物理层的概念 2. 关系模型是为摆脱地址而生的 2.1. “地址”不仅包括指针操作的地址&#xff0c;还包括数组下标等 3. 一个优雅的数据结构胜过一百行杂耍般的代码 3.1. 精巧的数据结构搭配笨拙的…

数据结构入门——顺序表(保姆级教程,增,删,改,查)

1.什么是顺序表 1.顺序表&#xff1a;可动态增长的数组&#xff0c;要求数据是连续存储的 2.顺序表的定义&#xff1a; 静态顺序表&#xff1a;使用定长数组存储元素&#xff08;缺点&#xff1a;小了不够用&#xff0c;大了还浪费&#xff09; 动态顺序表&#xff1a;可根…

744. 寻找比目标字母大的最小字母

给你一个字符数组 letters&#xff0c;该数组按非递减顺序排序&#xff0c;以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这样的字符&#xff0c;则返回 letters 的第一个字符。 示例 1&#xff1a; 输入: le…