树的层次遍历(广度优先搜索BFS)

2023-11-06

在这里插入图片描述

解题思路:采用树的层次遍历的方式(在图中叫广度优先遍历),使用队列取存储待遍历的节点。程序的结束就是队列为空。
1.整体上,出队列的节点指向队列中的0号元素,比如1遍历完成之后2,3进队列,2出队列,那么2的next指向队列中的0号元素即可。但是存在问题就是3会指向4,而且1没有指向了。
2.这里用到一个技巧,我们知道一颗满二叉树,层数n对应的节点为2 ^ (n -1),那么层数n对应的节点总数就是2 ^ n - 1。我们用一个变量tag记录当前正在遍历的层数,用num记录当前已经遍历的节点数。每次遍历完当前层之后都向队列中添加一个null,这样就解决了1中出现的问题。如果遇到为空的就跳过本次循环即可。

代码实现如下

/**
 * // Definition for a Node.
 * function Node(val, left, right, next) {
 *    this.val = val === undefined ? null : val;
 *    this.left = left === undefined ? null : left;
 *    this.right = right === undefined ? null : right;
 *    this.next = next === undefined ? null : next;
 * };
 */

/**
 * @param {Node} root
 * @return {Node}
 */
var connect = function(root) {
    // let head = root
    let Queue = [] // 使用层次遍历的方式
    // 只有在2^n的时候才会向队列中添加null
    let tag = 1  // 这个记录层数
    let num = 0 // 这个记录节点的数量
    Queue.push(root)
    num++
    //判断是否应该进入下一层
    if((Math.pow(2,tag) - 1)===num){
        Queue.push(null)
        //接下来进入下一层
        tag++
    }
    while(Queue.length){
        let temp = Queue.shift()
        // 如果当前节点是空的时候就表示当前这层遍历结束
        if(!temp) continue
        temp.next = Queue[0]
        // 左右节点进队列
        Queue.push(temp.left)
        Queue.push(temp.right)
        num+=2
        //判断是否应该进入下一层
        if((Math.pow(2,tag) - 1) === num){
            Queue.push(null)
            //接下来进入下一层
            tag++
        }
    }
    return root
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树的层次遍历(广度优先搜索BFS) 的相关文章

  • 数字化转型:科技赋能供给创造需求 附下载

    疫情对各行业及科创的影响我们都深切地感受到了 像AI家居 AR游戏等比较火爆的项目都是在疫情中喷发 此报告结合疫情驱动新兴技术演变及商业落地的态势 探讨数字化对于科创的意义 报告亮点 5G商业化将伴随成熟应用由点向面展开 人工智能和企业数字
  • 06-底层必备源码-JVM底层-GC算法流程(自我总结)

    一 判断 是否GC 的算法 1 引用计数法 1 1 规则 如果这个obj被引用 计数器 1 引用失效 计数器 1 当一个obj的引用计数器为0 就不代表被使用 1 2 缺点 不能解决循环引用的问题 2 可达性分析算法 2 1 规则 以GCr

随机推荐

  • Keras CIFAR-10图像识别数据集 2021-07-10

    Keras CIFAR 10图像识别数据集 一 下载CIFAR 10数据 1 导入所需模块 from keras datasets import cifar10 import numpy as np np random seed 10 2
  • 万事开头难——Android SDK安装

    首届 Google 暑期大学生博客分享大赛 2010 Andriod 篇 今天研究了一上午才把SDK安装成功 真是万事开头难 下面就把安装的过程分享出来 Eclipse Android SDK 2 1环境部署 一 第一步安装JDK Java
  • t检验与Z检验的区别

    在统计学中 假设检验是评估某种特定情况下观察到的数据是否符合假设的一种方法 t检验和Z检验是两种常用的假设检验方法 分别用于比较均值差异以及比例差异 在医学统计中 t检验和Z检验经常被用于研究和比较不同治疗方法的效果 例如药物疗效 手术效果
  • spring JavaBean引入JavaBean ( 外部引用, 内部定义, 级联属性 )

  • 探针漏洞_长亭xray:一款自动化Web漏洞扫描神器(免费社区版)

    xray 简介 xray 是从长亭洞鉴核心引擎中提取出的社区版漏洞扫描神器 支持主动 被动多种扫描方式 自备盲打平台 可以灵活定义 POC 功能丰富 调用简单 支持 Windows macOS Linux 多种操作系统 可以满足广大安全从业
  • java删除指定目录下的文件(包括目录)

    代码 import java io File public class Test 判断指定的文件或文件夹删除是否成功 param FileName 文件或文件夹的路径 return true or false 成功返回true 失败返回fa
  • 网络综合布线实训室方案(2023版)

    综合布线实训室概述 随着智慧城市的蓬勃发展 人工智能 物联网 云计算 大数据等新兴行业也随之崛起 网络布线系统作为现代智慧城市 智慧社区 智能建筑 智能家居 智能工厂和现代服务业的基础设施和神经网络 发挥着重要作用 实践表明 网络系统故障的
  • 使用web3 部署智能合约

    CentOS 7 环境 web3安装 及 对象的创建 m0 47233175的博客 CSDN博客https blog csdn net m0 47233175 article details 121960931还未安装web3环境 请参照以
  • 《OpenGL ES 2.0 Programming Guide》摘录

    一 Introduction toOpenGL ES 2 0 1 What Is OpenGL ES OpenGL ES is an application programming interface API for advanced 3D
  • JPA中所有findBy语法规则(举例)

    JPA中findBy基本语法规则 1 首先先新建一个数据库 名字叫做jpatest 2 新建一个SpringBoot项目 如果新手还不会 请先阅读idea中如何快速创建SpringBoot项目 这边需要引入jpa mysql web的相关依
  • 深刻理解Linux进程间通信(IPC)

    http www cnblogs com andtt articles 2136279 html 0 序 1 管道 1 1 管道概述及相关API应用 1 2 有名管道概述及相关API应用 1 3 小结 1 4 参考资料 2 信号 上 2 1
  • 详解DenseNet(密集连接的卷积网络)

    前言 在计算机视觉领域 卷积神经网络 CNN 已经成为最主流的方法 比如最近的GoogLenet VGG 19 Incepetion等模型 CNN史上的一个里程碑事件是ResNet模型的出现 ResNet可以训练出更深的CNN模型 从而实现
  • C++中enum的大小

    关于枚举类型所占内存的大小 书里对枚举大小的定义是 sizeof枚举是sizeof某类可以包含枚举range的整型 并且不会大于sizeof int 也就是说枚举大小不一定等于sizeof int 转载请尊重原创 保留相关链接本文来自多宝平
  • MySQL限制数据的小数位数——DECIMAL类型

    DECIMAL简介 DECIMAL从MySQL 5 1引入 列的声明语法是DECIMAL M D NUMERIC与DECIMAL同义 如果字段类型定义为NUMERIC 则将自动转成DECIMAL 对于声明语法DECIMAL M D 自变量的
  • 蓝斯登定律(转载)

    给员工快乐的工作环境 蓝斯登定律 给员工快乐的工作环境 跟一位朋友一起工作 远较在父亲之下工作有趣得多 提出者 美国管理学家蓝斯登 点评 可敬不可亲 终难敬 有权没有威 常失权 编辑 从案例中体会蓝斯登定律 连续20年保持赢利的美国西南航空
  • 机器学习特征工程

    特征工程 目录 特征工程 1 数据预处理 1 1数据无量纲化 1 2缺失值处理 1 3处理分类型特征 编码与哑变量 1 4处理连续型特征 二值化与分段 1 5数据变换 总结 2 特征选择 2 1 Filter 2 1 1 方差选择法 2 1
  • Qt Creator打开CMake管理的Quick工程,并调试qml

    文章目录 前言 一 需求背景 二 遇到的问题 三 解决方案 四 Demo 提示 以下是本篇文章正文内容 下面案例可供参考 一 需求背景 1 需要对Qml程序进行调试 2 用CMake管理工程文件 3 能用Qt Creator或者VS进行开发
  • 数据库之postgresql库锁表解锁

    1 检索出死锁进程的ID SELECT FROM pg stat activity WHERE datname 死锁的数据库ID 检索出来的字段中 wating 字段 数据为t的那条 就是死锁的进程 找到对应的 procpid 列的值 2
  • LWIP UDP 编程

    一 udp c实现的函数 1 void udp input struct pbuf p struct netif inp 说明 处理接收到的udp数据包 参数 p数据包缓存区 inp网络接口 2 err t udp send struct
  • 树的层次遍历(广度优先搜索BFS)

    解题思路 采用树的层次遍历的方式 在图中叫广度优先遍历 使用队列取存储待遍历的节点 程序的结束就是队列为空 1 整体上 出队列的节点指向队列中的0号元素 比如1遍历完成之后2 3进队列 2出队列 那么2的next指向队列中的0号元素即可 但