(二叉)树的遍历

2023-11-05

树,包括图,在遍历时都存在两种方式:深度优先遍历和广度优先遍历。
树,一定有一个根节点,而图,没有根节点,但图中的任意节点都可以作为根节点使用(当然该节点一定要有边,否则没有意义)

深度优先遍历

  1. 访问当前节点
  2. 将当前节点的children作为子树的根节点递归访问

使用递归的方式

// 传入树的根节点,开始深度优先遍历
function dfs(root) {
  // 访问节点数据
  console.log(root.val);
  if (root.children.length > 0) {
    for(let i = 0; i < root.children.length; i ++) {
      dfs(root.children[i]);
    }
    // 或者使用root.children.forEach(dfs)来替换上面的for循环
  }
}

广度优先遍历

  1. 新建队列,将根节点入队
  2. 队列出队,访问出队节点
  3. 将出队节点的children依次入队
  4. 重复2和3,直到队列为空

使用队列的方式

// 传入树的根节点,开始深度优先遍历
function bfs(root) {
  const queue = [];
  queue.push(root);
  while(queue.length > 0) {
    const node = queue.shift();
    console.log(node.val);
    node.children && node.children.forEach(child => queue.push(child))
  }
}

在打包模块时,可以使用广度优先遍历从入口文件触发,构建模块的依赖图谱。

二叉树的先中后序遍历

先、中、后指的是根节点的访问顺序

先序遍历

  1. 访问根节点
  2. 对左子树先序遍历
  3. 对右子树先序遍历
// 先序遍历
function preOrder(root) {
  // 递归终止条件
  if (!root) return;
  console.log(root.val);
  preOrder(root.left);
  preOrder(root.right);
}

中序遍历

  1. 对左子树中序遍历
  2. 访问根节点
  3. 对右子树中序遍历
// 中序遍历
function inOrder(root) {
  if (!root) return;
  inOrder(root.left);
  console.log(root.val);
  inOrder(root.right);
}

后序遍历

  1. 对左子树后序遍历
  2. 对右子树后序遍历
  3. 访问根节点
// 后序遍历
function postOrder(root) {
  if (!root) return;
  postOrder(root.left);
  postOrder(root.right);
  console.log(root.val)
}

非递归型的遍历

所有的递归都可以用栈来代替,因为递归函数底层就是使用栈来实现的。

先序遍历

  1. 访问根节点
  2. 对左子树先序遍历
  3. 对右子树先序遍历
function preOrder(root) {
  if (!root) {return;}
  const stack = [];
  stack.push(root);
  while(stack.length > 0) {
    // 出栈
    const node = stack.pop();
    console.log(node.val);
    // 将左右子树入栈, 先让右子树入栈,再让左子树入栈
    if (node.right) {
      stack.push(node.right);
    }
    if (node.left) {
      stack.push(node.left);
    }
  }
}

中序遍历

  1. 对左子树中序遍历
  2. 访问根节点
  3. 对右子树中序遍历
// 中序遍历
function inOrder(root) {
  if (!root) {return;}
  const stack = [];
  let p = root;
  while(p || stack.length > 0) {
    while(p) {
      // 先将左子树不断入栈
      stack.push(p);
      p = p.left;
    }
    // 所有左子树都入栈后,开始出栈访问
    const node = stack.pop();
    console.log(node.val);
    // 将右子树入栈
    p = node.right;
  }
}

后序遍历

  1. 对左子树后序遍历
  2. 对右子树后序遍历
  3. 访问根节点
// 后序遍历
function postOrder(root) {
  if (!root) {return;}
  const stack = [];
  const outPutStack = [];
  stack.push(root);
  // 对前序遍历进行改造,前序遍历是 根 -> 左 -> 右,后续遍历是左 -> 右 -> 根,
  // 将前序遍历改造成 根 -> 右 -> 左,然后逆序输出访问即可
  while(stack.length > 0) {
    // 出栈
    const node = stack.pop();
    outPutStack.push(node)
    // 前序遍历改造,先将左子树入栈,再将右子树入栈
    if (node.left) {
      stack.push(node.left);
    }
    if (node.right) {
      stack.push(node.right);
    }
  }
  while(outPutStack.length > 0) {
    const node = outPutStack.pop();
    console.log(node.val);
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(二叉)树的遍历 的相关文章

  • 忘记网站服务器密码怎么办,忘记远程服务器的密码怎么办

    忘记远程服务器的密码怎么办 内容精选 换一换 如果在创建弹性云服务器时未设置密码 或密码丢失 过期 可以参见本节操作重置密码 密码丢失或过期前 已安装密码重置插件 公共镜像创建的弹性云服务器默认已安装一键重置密码插件 私有镜像创建的云服务器
  • Matlab—M_Map的实战学习笔记(一)M_Map库的安装

    最近在做美赛集训 做到了2020年的美赛A题 有关苏格兰附近鲭鱼和鲱鱼分布预测问题 在写论文的过程中 为了画几张精美的地图 可谓是历经千难万险 花费了不少时间 走了不少弯路 现在对使用matlab的m map映射库进行地图绘制做一个总结 力
  • Python:UnicodedecodeError编码问题解决方法汇总-彻底解决

    今天真的被编码问题一直困扰着 午休都没进行 也真的见识到了各种编码 例如 gbk unicode utf 8 ansi gb2312等 如果脚本程序中编码与文件编码不一致 就会报出UnicodedecodeError的错误 1 情景一 读文
  • python语法-面向对象(构造方法、魔术方法)

    python语法 面向对象 构造方法 魔术方法 1 构造方法 构造方法 python类可以使用 init 方法 称之为构造方法 可以实现 在创建类对象时 会自动执行 在创建类对象时 将传入参数自动传递给 init 方法使用 演示使用构造方法
  • Android中的定时器Timer、AlarmManager、CountDownTimer的使用

    1 Timer和TimerTask的使用 java util Timer定时器 实际上是个线程 定时调度所拥有的TimerTasks 1 创建一个Timer code class hljs cs has numbering style di
  • 解析 Linux 内核可装载模块的版本检查机制

    解析 Linux 内核可装载模块的版本检查机制 王 华东 系统工程师 自由职业者 简介 为保持 Linux 内核的稳定与可持续发展 内核在发展过程中引进了可装载模块这一特性 内核可装载模块就是可在内核运行时加载到内核的一组代码 通常 我们会
  • js获取到的时间减1秒或加1秒

    如题 使用时间戳来计算 function setDate time isAdd var date getCurTime time 也可以直接透传如 2021 5 8 var d new Date date var t s d getTime
  • 闲鱼把各种玩法做成了一个平台:哆啦A梦

    玩法平台背景 在闲鱼内我们把供给用户的闲鱼红包 支付宝红包 包邮券 宝卡等统称为用户权益 是闲鱼用户运营的重要策略 在拉新 留存 促活 裂变等方面都展现了其重要价值 在阿里内部管理权益的平台是拉菲 拉菲对外提供概率抽奖和领奖两种能力 各个业
  • 为什么gbk编码常用抽取正则表达式无法抽取“嘚瑟“的“嘚”字

    根据 GBK汉字内码扩展规范编码表 http ff 163 com newflyff gbk list 可以查到 嘚 字的编码为874e 而我们常用的gbk汉字抽取正则表达式为 x80 xff x80 xff 以python正则为例 抽取汉
  • Python基础--入门基础和数据类型测试题(二)

    Made By Zly All Right Reversed 上一篇 篇四 Python 入门基础和数据类型测试题 二 1 以下不属于Python语言保留字的是 A do B pass C while D def 2 表达式3 4 2 8
  • 第一讲 检索系统与数据库编程

    第一讲 检索系统与数据库编程 准备工作 1 检索系统 1 1 检索系统初识 1 1 1 什么是检索系统 1 1 2 从认知心理学看待检索系统 1 2 检索系统的四大法宝 1 2 1 检索的工具 结构化查询语言 SQL 1 2 2 检索的环境
  • Electron-builder打包和自动更新

    前言 文本主要讲述如何为 electron 打包出来软件配置安装引导和结合 github 的 release 配置自动更新 electron builder 是将 Electron 工程打包成相应平台的软件的工具 我的工程是使用 elect
  • C语言小知识点

    1 LPCSTR被定义成是一个指向以 0 结尾的常量字符指针 LPWSTR是wchar t字符串 例子 LPWSTR lpwstr NULL LPWSTR lp T asdfasgaf 2 之所以能够实现条件编译是因为预编译指令是在编译之前
  • HTTP请求头和响应头详解【转】

    最近老猿在开始学习爬虫相关的知识 由于老猿以前只做非web的后台应用 发现相关知识太过匮乏 导致学习很困难 为此不得不从一些基础知识恶补开始 对于这些知识 老猿会将网上找到的比较认可的内容直接转发 下面文章关于http头部信息讲解的非常详细
  • springboot笔记总结

    springboot 1 Javaconfig Configuration 放在类的上面 这个类相当于 xml 配置文件 可以在其中声明 bean Bean 放在方法的上面 方法的返回值是对象类型 这个对象注入到 spring ioc 容器
  • 字典排序算法(通俗易懂)

    我们先看一个例子 示例 1 2 3的全排列如下 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 我们这里是通过字典序法找出来的 那么什么是字典序法呢 从上面的全排列也可以看出来了 从左往右依次增大 对这就是字典序法
  • Java中 ? extends T 和 ? super T 的理解

    通配符类型
  • (转)如何有效地管理好技术团队?

    转自 https cn 100offer com blog posts 307 技术管理是一个综合性岗位 要求你具有技术能力 管理能力 也要懂一些心理学 情商也要高一些 说实话 你想做好这个岗位 真的不容易 尤其是在中国 我相信今天的分享过
  • 策略+工厂+反射记录一次switch代码简化过程

    遇到的问题 一张记录表 记录了10个业务的字段 一个入参type说明了要修改哪个字段 最初是通过switch type case 来做的 但是涉及这样子的判断多了 每次都要不断的switch 并且case里面不同方法有不同的处理 一个公共的

随机推荐

  • 河南省历年高考人数(2004-2021)

    河南省历年高考人数 2004 2021 年份 人数 万人 2004 59 55 2005 72 2006 78 2007 87 88 2008 98 8 2009 95 9 2010 95 24 2011 85 5 2012 80 5 20
  • 系统还原服务器,服务器系统还原

    服务器系统还原 内容精选 换一换 1 说明2 制作系统还原盘3 测试恢复还原1 说明http clonezilla nchc org tw clonezilla live download clonezilla live 2 6 7 28
  • 单调队列的学习 - 滑动窗口求最大/小值 (Leetcode 239, Sliding Window Maximum)

    这几天在学习单调队列和单调栈 感觉下面几篇博客讲的比较好 http www cnblogs com saywhy p 6726016 html http dping26 blog 163 com blog static 1795662172
  • 基于UDP实现双工通信(JAVA)(多线程)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 总结 前言 写个基础的JAVA网络程序 实现双工通信 一 两个类 1 一个累 代码如下 示例 import java io IOException impor
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 合并日志树——LSM Tree

    一 背景 大数据情景下 需要巨量的读写数据 即良好的IO效率 传统的B树以及其变种无法满足 因为它的读写在物理上是随机的 这样IO的效率就不高 于是便有了LSM log structed merge tree 合并日志树这个设计思想或者说存
  • Latex字体加粗

    You latex 字体加粗 什么代码 ChatGPT 在 LaTeX 中 要使文本加粗 可以使用 textbf 命令或 bfseries命令 以下是示例代码 使用 textbf 命令 textbf This is bold text 使用
  • QTREE5 - Query on a tree V【LCT】

    题目链接 你被给定一棵n个点的树 点从1到n编号 每个点可能有两种颜色 黑或白 我们定义dist a b 为点a至点b路径上的边个数 一开始所有的点都是黑色的 要求作以下操作 0 i 将点i的颜色反转 黑变白 白变黑 1 v 询问dist
  • Snipaste 使用方法

    下载 Snipaste 下载完成后 解压文件如图 双击Snipaste exe后 可以看到状态栏中有 右键图标可以看到详细配置信息 按需配置即可 截图之后点击下图红框图钉可以钉住截图区域
  • python 笔记:PyTrack(将GPS数据和OpenStreetMap数据进行整合)【官网例子解读】

    论文笔记 PyTrack A Map Matching Based Python Toolbox for Vehicle Trajectory Reconstruction UQI LIUWJ的博客 CSDN博客4 0 包的安装 官网的两种
  • JavaWeb实现查询功能

    写在前面 你们好 我是小庄 很高兴能和你们一起学习JavaWeb 如果您对Java感兴趣的话可关注我的动态 写博文是一种习惯 在这过程中能够梳理知识和巩固知识点 需求 当搜索框为空时 查询数据库所有商品 输入商品名时 进行模糊查询 实现思路
  • SpringBoot JPA 中无法注入 JpaRepository 接口的问题及解决方案

    错误 No qualifying bean of type xxx xxx xxx available expected at least 1 bean which qualifies as autowire candidate Depen
  • C语言输出100以内的全部素数。

    include
  • matlab练习程序(灰度、二值图像腐蚀膨胀)

    cl img gray imread fupeng jpg img erzhi imread erzhi fupeng jpg imshow img gray figure imshow img erzhi m n size img gra
  • 文件目录大小

    题目描述 一个文件目录的数据格式为 目录id 本目录中文件大小 子目录id列表 其中目录id全局唯一 取值范围 1 200 本目录中文件大小范围 1 1000 子目录id列表个数 0 10 例如 1 20 2 3 表示目录1中文件总大小是2
  • 解决 vba 报错:要在64位系统上使用,请检查并更新Declare 语句

    将错误处的 Declare 替换成 Declare PtrSafe 即可
  • java正则

    一 Pattern类和Matcher类 java util regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包 它包括两个类 Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表
  • docker 安装向量数据库 Milvus

    Miluvs 官网为 www milvus io Milvus 向量数据库能够帮助用户轻松应对海量非结构化数据 图片 视频 语音 文本 检索 单节点 Milvus 可以在秒内完成十亿级的向量搜索 请参考 在线教程 分布式架构亦能满足用户的水
  • LSTM模型预测新冠

    LSTM是RNN的改进型 传统RNN模型会随着时间区间的增长 对早期的因素的权重越来越低 有可能会损失重要数据 而LSTM模型通过遗忘门 输入门 输出门三个逻辑 来筛选和保留数据 原理详解可以参考如何从RNN起步 一步一步通俗理解LSTM这
  • (二叉)树的遍历

    树 包括图 在遍历时都存在两种方式 深度优先遍历和广度优先遍历 树 一定有一个根节点 而图 没有根节点 但图中的任意节点都可以作为根节点使用 当然该节点一定要有边 否则没有意义 深度优先遍历 访问当前节点 将当前节点的children作为子