1、二叉树先序,中序,后序遍历的递归和非递归方法(JS实现)。_js二叉树的先序,中序,后序遍历非递归_abuanden的博客-程序员秘密

技术标签: 算法  技能树  二叉树  # 前端算法  

查找某个节点的路径的方法通常有两种,一种是递归算法,另一种是非递归算法

以中序遍历为例

1、定义树节点

class TreeNode{
    
    constructor(value){
    
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

2、构建树

// 构建树
let root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
console.log(root);//如下图

在这里插入图片描述

递归算法

// 递归中序遍历二叉树
function midOrder(root) {
     
    if(!root || !(root instanceof TreeNode)){
    
        return;
    }
    //instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
    // 递归访问左子树
    midOrder(root.left);
    console.log(root.value);
    // 递归访问右子树
    midOrder(root.right);
}
midOrder(root);

非递归算法

// 非递归中序遍历二叉树
function midOrderN(root) {
     
    let p = root; // p为当前遍历的节点, 初始为根
    let arr = []; // arr作为栈
    while(p || arr.length !== 0){
    
        if(p){
    
            // 遍历左子树
            arr.push(p);
            // 每遇到非空二叉树先向左走
            p = p.left;
        }else{
    
            // p为空,出栈
            let node = arr.pop();
            // 访问该节点
            console.log(node.value);
            // 向右走一次
            p = node.right;
        }
    }
 }
 midOrderN(root)

前序、中序、后序

以下为牛客网的试题

递归写法

function TreeNode(x){
    
    this.val=val;
    this.left=null;
    this.right=null;
}
// 递归方法
function threeOrders(root){
    
    let preArray=[],middleArray=[],lastArray=[];
    //先序遍历:根、左、右
    function preOrder(root){
    
        if(root){
    
            preArray.push(root.val);
            preOrder(root.left);
            preOrder(root.right);
        }
    }
    //中序遍历 : 左 根 右   
    function inOrder(root){
    
            if(root){
    
                inOrder(root.left)
                middleArray.push(root.val);
                inOrder(root.right);
            }
    }
    //后序遍历:左右根
    function lastOrder(root){
    
        if(root){
    
            lastOrder(root.left);
            lastOrder(root.right);
            lastArray.push(root.val);
        }
    }
    preOrder(root);
    inOrder(root);
    lastOrder(root);
    return [preArray,middleArray,lastArray]
}

非递归写法

function threeOrders(root){
    
    //非递归算法实现先序遍历二叉树,根左右,所以向数组中push一个元素
    function preOrder(root){
    
        let res=[],
        stack=[root];
        while(stack.length>0){
    
            let node=stack.pop();
            res.push(node.val);
            if(node.right){
    
                stack.push(node.right);
            }
            if(node.left){
    
                stack.push(node.right);
            }

        }
        return res;
    }
    //非递归算法 实现中序遍历二叉树   首先遍历找到最深层的左子树,
    function inOrder(root){
    
        let res=[],
            stack=[];
            while(root||stack.length>0){
    
                while(root){
    
                    stack.push(root);
                    root=root.left;
                }
                root=stack.pop();
                res.push(root.val);
                root=root.right;
            }
            return res;
    }
    // 非递归算法实现后序遍历二叉树, 和先序遍历二叉树类似,唯一区别是向数组中unshift元素,先push左再push右
    function lastOrder(root){
    
        let res=[],
        stack=[root];
        while(stack.length>0){
    
            let node=stack.pop();
            res.unshift(node.val);
            if(node.left){
    
                stack.push(node.left);
            }
            if(node.right){
    
                stack.push(node.right);
            }
        }
        return res;
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/abuanden/article/details/114339521

智能推荐

LabVIEW LINX Toolkit控制Arduino设备(拓展篇—1)_labview spi接口_不脱发的程序猿的博客-程序员秘密

LabVIEW LINX Toolkit可支持驱动Raspberry Pi、BeagleBoard和Arduino开发板,包含数字、模拟、SPI、I2C、UART、PWM等驱动接口,非常适合创客开发实践。

好友信息管理系统_TomLazy的博客-程序员秘密

设计要点:设计并编程实现一个好友信息管理的小系统。系统应包含每位好友的全部信息,包括姓名、性别、生日、爱好、联系方式、性格特点等。系统实现对好友信息进行增、删、改、查、生日提醒、统计计算等功能。题目要求:需求分析:    本阶段是整个软件开发过程中最重要的环节。通过了解实际运行的系统或与用户交谈,明确系统要完成的任务是什么。 &nbs...

php7随机数,random_int()_倦与暮的博客-程序员秘密

random_int()(PHP 7)Generates cryptographically secure pseudo-random integers说明random_int(int$min,int$max):intGenerates cryptographic random integers that are suitable for use where unbiased results ar...

入侵检测——fping(扫描篇)_lainwith的博客-程序员秘密

目录环境介绍参数数据包参照组数据包(使用ping命令)windows下使用cmd发出的ping包kali在终端中发出的ping包fping发出的数据包单个主机扫描(无回应)单个主机扫描(有回应)网段扫描规则环境介绍NAT模式:kali攻击方win7受害者Metasploitable受害者参数1:基于icmp的单个主机发现fping 192.168.56.1022:基于icmp的网段扫描-a参数显示存活的主机-g通过指定开始和结束地址来生成目标列表,可以使网段fping -a -

(原創) Write once, compile everywhere? (C/C++) (SystemC) (VC++) (IC Design)_weixin_34344403的博客-程序员秘密

Abstract這兩天寫SystemC的第一個作業,其實花最多時間是在Compiler身上。由於SystemC本身並不是一個程式語言,而是架構在C++上,利用C++的Generics特性擴充其Library,使C++搖身一變成為HDL,且SystemC也沒有自己的IDE和Compiler,理論上只要是C++的Compiler就可以compile所有SystemC的code。Introducti...

随便推点

MaxCompute如何对SQL查询结果实现分页获取_odps offset_阿里云技术的博客-程序员秘密

由于MaxCompute SQL本身不提供类似数据库的select * from table limit x offset y的分页查询逻辑。但是有很多用户希望在一定场景下能够使用获取类似数据库分页的逻辑,对查询结果进行分页/分批获取结果,本文将介绍几种方法,来实现上述场景。1.借助row_number()函数作为递增唯一标识进行过滤查询select*from(select...

神州租车java面试题-2016_朝着希望前进的博客-程序员秘密

今天整理相册,发现神州的面试题。就发上来让大家参考一下。个人觉得面试题不是很重要,主要是后面的面试官问题,而面试问题每个面试官都问的比较随机。不过大体都会问一下: 1,java并发包下的内容,hashmap的数据结构 2,虚拟机相关的 3,spring,mybaitis原理和常用类 4,数据库优化 5,并发和高流量方案下面是面试题的拍照: 第五题照的不

Windows下部署OpenCV + Clang配置OpenCV_clang opencv_nobleman__的博客-程序员秘密

由于前提我机子上已经装CLion,和MinGW64,关于jetbrains家族的软件激活安装问题,和MinGW的详细安装就不提了。扯一句,下载一些常用的软件、资源时一定要按目录放好,专门放个地方,不要随便找个地方乱放。所以里面的路径大都是以opencv为根目录说的。Windows下部署OpenCV前提资源:1.Opencv​ link: https://www.openc...

xp系统安装后只有一个盘了别的分区的文件怎样找到_weixin_34162401的博客-程序员秘密

GHOST系统分区丢失是因为在重装系统时,选择了错误的选项导致把整个硬盘当成C盘来装,装完之后自然就只剩下一个盘。想要恢复丢失盘的文件,需要注意,别往现在的这个C盘存入新的文件(因为现在存入的文件可能会覆盖原先DEF盘的文件)。可以把硬盘拆下来挂到别的电脑当副盘或者接个移动硬盘,把数据恢复到移动硬盘里。具体的恢复方法看下文了解。工具/软件:流星数据恢复软件步骤1:先下载并解压程序运行后,直接双...

稳步前行or大干快上——5G非独立组网与独立组网_tiege8066的博客-程序员秘密

*******更多精彩5G内容请打开链接https://edu.csdn.net/course/detail/311825G标准的发布,相当于3GPP画了一只色香味俱全、令人垂涎欲滴的大蛋糕。那么,谁来做这只蛋糕呢?是各国的移动通信运营商。但是,这款蛋糕好是好,成本可是太高了。因为5G网络大都工作在很高的频段,每个基站的覆盖半径很小,若要形成大范围的覆盖需要建设大量的基站。万一投入巨额资金做成了这只蛋糕,很少有人买来吃怎么办?运营商的钱岂不是打水漂了?3GPP里都是些什么人哪,都是业界的精英翘楚啊,人家

python抢票代码_Python实现12306火车票抢票系统_weixin_39849548的博客-程序员秘密

Python实现12306火车票抢票系统效果图如下所示:具体代码如下所示:import urllib.request as requestimport http.cookiejar as cookiejarimport reimport osimport smtplibfrom email.mime.text import MIMETextimport timeuser = '' #登陆邮箱pwd...

推荐文章

热门文章

相关标签