JavaScript算法 — 二叉树遍历

news2024/12/27 17:40:55

目录

  • 1、构造二叉树
  • 2、递归遍历
  • 3、非递归遍历
    • 3.1 先序
    • 3.2 中序
    • 3.3 后序

1、构造二叉树

树节点:

// 二叉树节点的构造函数
function TreeNode(val, left, right) {
    this.val = (val===undefined ? 0 : val)
    this.left = (left===undefined ? null : left)
    this.right = (right===undefined ? null : right)
}

下面我们需要遍历下面这颗二叉树:
在这里插入图片描述
遍历结果:
先序:“中 - 左 - 右” 0137849256
中序:“左 - 中 - 右” 7381940526
后序:“左 - 右 - 中” 7839415620

2、递归遍历

调用递归的位置不同,结果分为三种。

var preorder = []// 前序结果
var inorder = []// 中序结果
var postorder = []// 后序结果

var loop = function(root){
	// 当前节点为空,表示达到了叶子节点
    if (root == null) return

    preorder.push(root.val)  // 前序
    loop(root.left)
    inorder.push(root.val)// 中序
    loop(root.right)
    postorder.push(root.val)// 后序
}
loop(root)

3、非递归遍历

3.1 先序

  1. 根节点入栈,依此取出栈顶元素。
  2. 访问栈顶元素,同时出栈,将栈顶元素作为当前元素,当前元素右节点入栈,左节点入栈(注意:右先入那么右后出)。
  3. 重复上述操作,直到整个栈为空时,则遍历结束。
var preorderTraversal = function(root) {
    var arr = []
    arr.push(root)
    var res = []
    while (arr.length) {
        var temp = arr.pop()
        if (!temp) break;
        //当前节点的值放入结果数组
        res.push(temp.val)
        //右子树入栈
        if (temp.right) {
            arr.push(temp.right)
        }
        //左子树入栈
        if (temp.left) {
            arr.push(temp.left)
        }
    }
    return res
};

3.2 中序

  1. 循环将根节点和其的左子树入栈。
  2. 直到左子树为空时,访问栈顶元素,同时将栈顶元素作为当前元素,并出栈。
  3. 开始访问右子树,循环出栈直到整个栈为空时,则遍历结束。
var inorderTraversal = function(root) {
    var res = []
    var arr = []

    while(arr.length || root) {
        if (root) {
            arr.push(root)
            root = root.left
        } else {
            let temp = arr.pop()
            res.push(temp.val)
            root = temp.right
        }
    }

    return res
};

3.3 后序

和前序遍历思想相反。
先序是使用push往res数组后面加数据,二后序是使用unshift往数组前面加数据。

var postorderTraversal = function(root) {
    var arr = []
    arr.push(root)
    var res = []
    while(arr.length) {
        var temp = arr.pop()
        if (!temp) break
        res.unshift(temp.val)// 从前往后塞入数据
        if(temp.left) {// 左节点先入栈
            arr.push(temp.left)
        }
        if(temp.right) {
            arr.push(temp.right)
        }
    }

    return res
};

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

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

相关文章

给好朋友用代码画一个爱心吧

目录 效果图 html爱心 python爱心 ​编辑 代码 html python 浅浅分析一下《燃烧我,照亮你》剧中的爱心代码 光棍节要到了,不给心意的人写个爱心代码? 话不多说,上才艺,这里有两种爱心,一种是html&a…

Unity功能—— 在VS中快速访问Unity API对应文档

声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改。 Unity功能—— 在VS中快速访问Unity API对应文档 文章目录Unity功能—— 在VS中快速访问Unity API…

光点科技数据口袋数据填报系统满足多类型企业报表需求_光点科技

在招聘过程中,HR对数据处理存在一定的需求,手动整理繁杂的数据无疑是加大招聘工作量,因此,借助数据填报系统更好地进行处理数据工作,不失为帮助HR减轻招聘工作量的良方。 光点数据填报系统利用传统商业报表工具进行数据…

中国热泵空调行业发展趋势及投资风险研究报告

智研瞻产业研究院专注于中国产业经济情报及研究,目前主要提供的产品和服务包括传统及新兴行业研究、商业计划书、可行性研究、市场调研、专题报告、定制报告等。涵盖文化体育、物流旅游、健康养老、生物医药、能源化工、装备制造、汽车电子、农林牧渔等领域&#xf…

基于springboot二手交易平台

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,非前后端分离 前端技术:vue.jselementUI等框架实现 服务端技术:springbootmybatis-pl…

Linux服务器中配置tomcat的服务,并通过端口8888访问

引言: Tomcat是常见的免费的web服务器,前端服务很多都是通过tomcat部署的!所以多了解点肯定没坏处! 一、配置端口 1.防火墙策略中配置8888端口,并允许策略: 二、安装tomcat包 1.新建tomcat文件夹 进入 /usr/local,并新建文件夹…

弹框确认按钮,请求两个接口跳转刷新页面,并使用async和await将异步改成同步的数据?

前景&#xff1a;公司前后端不分离项目&#xff0c;使用的框架element-ui较低版本的&#xff0c;弹框确定按钮加载动态按钮的loading。 //插件 npm i element-ui -S效果图: 代码: <template><div><el-button type"text" click"dialogVisible …

Hive——操作数据库创建修改表(DDL数据定义)

DDL操作1. 数据库操作1.1 创建&查询数据库1.2 修改&删除数据库2. 表操作2.1 创建表2.2 内部表和外部表2.2.1 管理表2.2.2外部表2.2.3管理表与外部表的互相转换2.3 修改表1. 数据库操作 1.1 创建&查询数据库 定义&#xff1a; CREATE DATABASE [IF NOT EXISTS] d…

IDEA settings设置技巧,最常用快捷键,让你的编译器用更加得心应手

导读 每次下载安装新的 IDEA 以后&#xff0c;都免不了对该软件进行一些优化配置&#xff0c;以方便我们在使用的时候更加得心应手。一份趁手的设置&#xff0c;无疑能让我们的工作效率事半功倍。 碍于每次自己重装 IDEA 都需要去网搜一大堆文章去设置 settings&#xff0c;所以…

Vue框架的学习(Vue的基础指令操作二 V-For)第二课

今天的任务理解下面的几个指令操作 重点在V-for上 V-if V-else V-show V-For 本文章的重心放在V-For 从数据到数组到对象一步一步的去查找 底层的原理 v-show和v-if的用法看起来是一致的&#xff0c;也是根据一个条件决定是否显示元素或者组件 下面是 V-if V-else V-sho…

1. 云计算简介

1.2 云计算的定义和分类 云计算的定义 美国国家标准与技术研究院&#xff08;NIST&#xff09;定义&#xff1a; 云计算是一种模型&#xff0c;它可以实现随时随地、便捷地、随需应变地从可配置计算资源共享池中获取所需的资源&#xff08;例如&#xff0c;网络、服务器、存…

【记录】终端如何 进入conda(base) 环境,如何退出 conda(base)环境,终端快速进入Jupyter notebook的方法

目录一、终端 进入 conda&#xff08;base&#xff09; 环境二、终端 退出 conda&#xff08;base&#xff09; 环境三、终端进入 Jupyter notebook 的方法一、终端 进入 conda&#xff08;base&#xff09; 环境 --->> win R : 输入cmd 回车&#xff0c;进入终端界面。…

什么是微服务?怎么测试?今天一次性讲清楚...

01、什么是微服务 Adrian Cockcroft对微服务的表述&#xff1a;loosely couped service oriented architecture with bounded context。 这里涉及两个微服务的概念&#xff1a; loosely couped&#xff1a;松耦合 松耦合可以引申出其他概念&#xff0c;如各自独立&#xff0c…

坚持软件自主可控,打造国产化公文交换系统

编者按&#xff1a;软件自主可控是什么意思&#xff1f;企业如何对自己使用的软件做到自主可控&#xff1f;本文分析了软件自主可控的概念及意义&#xff0c;并通关相关案例展示了国产化低代码平台是如何助力企业打造公文交换系统的。 软件自主可控的意义 说到软件的自主可控&…

【分享 10 个日常使用的脚本】

&#x1f935;‍♂️ 个人主页老虎也淘气 个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f44d;&#x1f3fb; 收藏…

第十节:继承【java】

目录 &#x1f4d8;1.1为什么需要继承 &#x1f4d2;1.2 继承概念 &#x1f4d7;1.3 继承的语法 &#x1f4d5;1.4 父类成员访问 &#x1f3b1;1.4.1 子类中访问父类的成员变量 &#x1f38e;1.4.2 子类中访问父类的成员方法 &#x1f4d9;1.5 super关键字 &#x1f4d…

基于Matlab利用移动目标指示雷达抑制地面杂波(附源码)

目录 一、构建雷达系统 二、定义目标 三、杂波 四、仿真接收到的脉冲和匹配滤波器 五、使用三脉冲消除器执行 六、使用交错PRF模拟接收到的脉冲 七、对交错的 PRF 执行 八、总结 九、程序 本示例显示了移动目标指示 &#xff08;MTI&#xff09; 雷达的设计&#xff0…

《Java》private、protected、public区别及解析

我们今天来给大家解析一下Java中四种修饰类型的区别。 那么有的老铁就疑惑了&#xff0c;文章名称不是说三种吗&#xff1f;其实还有一种隐藏的修饰类型&#xff08;默认类型&#xff09;英文翻译过来的话是define&#xff0c;这就是我们什么都不修饰&#xff0c;例如&#xff…

【C/C++动态内存 or 柔性数组】——对动态内存分配以及柔性数组的概念进行详细解读(张三 or 李四)

目录前言&#xff08;栈区、堆区、静态区&#xff09;动态内存函数malloc与freecalloc与freerealloc与free常见的动态内存错误经典笔试题&#xff08;再见张三&#xff09;柔性数组前言&#xff08;栈区、堆区、静态区&#xff09; 请耐心看完&#xff0c;看完后就会对内存中的…

天玑9200领跑背后,高端芯片掀起蝴蝶效应

过去一年&#xff0c;天玑9000让联发科在高端旗舰机市场掀起了一场“旋风”。全球知名市场调研机构Counterpoint Research发布的报告显示&#xff0c;联发科在全球和中国智能手机芯片市场份额中连续八个季度保持第一的领先地位&#xff0c;且在高端手机市场的份额有显著增长。另…