首页 > 编程语言 >javascript-代码随想录训练营day14

javascript-代码随想录训练营day14

时间:2022-12-08 15:23:39浏览次数:74  
标签:遍历 cur javascript 随想录 stack day14 push root 节点

递归的三要素:

  1. 递归函数的参数和返回值
  2. 单层递归的逻辑
  3. 终止条件

144.二叉树的先序遍历

题目链接:

https://leetcode.cn/problems/binary-tree-preorder-traversal/

题目描述:

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

输入:root = [1,null,2,3]
输出:[1,2,3]

思路:

二叉树的先序遍历指的是按照先遍历根节点,再遍历左子树,最后遍历右子树的顺序遍历二叉树。

具体的方法有递归和迭代两种写法。

递归方法:

var preorderTraversal = function(root) {
    let re = []
    firstOrder(root, re)
    return re
};
function preOrder(cur, list){
    if(!cur) return
    list.push(cur.val)
    firstOrder(cur.left, list)
    firstOrder(cur.right, list)
}

迭代方法:

利用栈后进先出的特性。开始时先将根节点入栈。接着设置一个循环,每一次循环都将栈顶节点弹出进行操作,之后依次将其右节点和左节点入栈。

var preorderTraversal = function(root) {
    if(!root) return []
    let re = []
    let stack = [root]
    while(stack.length > 0){
        let cur = stack.pop()
        re.push(cur.val)
        cur.right && stack.push(cur.right)
        cur.left && stack.push(cur.left)
    }
    return re
};

94.二叉树的中序遍历

题目链接:

https://leetcode.cn/problems/binary-tree-inorder-traversal/

题目描述:

给定一个二叉树的根节点 root ,返回 它的 中序 遍历

输入:root = [1,null,2,3]
输出:[1,3,2]

思路:

后序遍历就是先处理左子树,再处理根节点,最后处理右子树。

递归方法:

var inorderTraversal = function(root) {
    let re = []
    inOrder(root, re)
    return re
};
function inOrder(cur, list){
    if(!cur) return
    inOrder(cur.left, list)
    list.push(cur.val)
    inOrder(cur.right, list)
}

迭代方法:

迭代方法的关键就是显示构建和维护栈,可以类比递归来设计。

var inorderTraversal = function(root) {
    if(!root) return []
    let cur = root
    let stack = []
    let res = []
    while(stack.length || cur){
        if(cur){
            stack.push(cur)
            cur = cur.left
        }
        else{
            cur = stack.pop()
            res.push(cur.val)
            cur = cur.right
        }
    }
    return res
};

145.二叉树的后序遍历

题目链接:

https://leetcode.cn/problems/binary-tree-postorder-traversal/

题目描述:

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历

输入:root = [1,null,2,3]
输出:[3,2,1]

思路:

递归方法很简单,类似先序和中序遍历。但是迭代方法有一点复杂,复杂的点在于后序遍历处理节点的顺序是左-右-根,但是左右节点都是要由根节点获得,这代表会不止一次访问根节点,究竟哪一次访问根节点时对其进行处理就需要额外的条件来控制。

递归方法:

var postorderTraversal = function(root) {
    let re = []
    postOrder(root, re)
    return re
};
function postOrder(cur, list){
    if(!cur) return
    postOrder(cur.left, list)
    postOrder(cur.right, list)
    list.push(cur.val)
}

迭代方法:

我采取的方式是在每个节点入栈时增加一个flag。对某个节点的流程进行分析:这个节点会先入栈(root直接入栈,其他节点是作为父节点的子节点入栈,此时flag=0),之后的某次循环其作为栈顶节点被弹出(此时节点是作为根节点被访问到的),再将该节点和其右左子节点入栈(flag=1)。由于栈的性质,之后出栈符合后序的次序。

对整体流程来说就是:每次弹出节点时检查flag,为0说明这个节点是作为子节点被加入的,它的子节点没有被处理;为1则说明这个节点是作为根节点被加入的,它的子节点之前已经按照次序进栈出栈,现在该处理这个节点了(将其加入结果数组res中)

var postorderTraversal = function(root) {
    const stack = []
    let res = []
    if (!root) return []
    stack.push([root,0])
    while(stack.length) {
        const [node, flag] = stack.pop()
        if(flag) {
            res.push(node.val)
            continue;
        }
        stack.push([node, 1]) 
        if (node.right) stack.push([node.right, 0])
        if (node.left) stack.push([node.left, 0])
    };
    return res;
};

标签:遍历,cur,javascript,随想录,stack,day14,push,root,节点
From: https://www.cnblogs.com/endmax/p/16966181.html

相关文章

  • JavaScript入门⑧-事件总结大全
    JavaScript入门系列目录JavaScript入门①-基础知识筑基JavaScript入门②-函数(1)基础{浅出}JavaScript入门③-函数(2)原理{深入}执行上下文JavaScript入门④-万物皆......
  • 通俗的英文指南——Javascript的原型
    ​​http://www.w3cplus.com/js/a-plain-english-guide-to-javascript-prototypes.html​​​当我开始学习JavaScript的对象模型时,第一反应就是难以......
  • 【代码随想录】第8章 二叉树
    第8章二叉树1.二叉树理论基础二叉树种类(1)满二叉树(2)完全二叉树(3)二叉搜索树或称二叉查找树中序遍历是递增序列(4)平衡二叉搜索树二叉树的存储方式可以链式存储,也可以顺序存......
  • 四、程咬金——JavaScript基础
     一、前言Ajax,异步JavaScript和XML,前面已经解释过,所以Ajax的学习还包含JavaScript和XML,这里我们先看JavaScript,而JavaScript实际上又是包含JavaScript语法和HTMLDOM即文档......
  • 《悟透javascript》学习笔记
    《悟透javascript》学习笔记 一、         前言 二、         回归简单、基本类型 三、         表演、似类却不是类 四、      ......
  • 《悟透javascript》学习笔记:X、深入继承
    引言      JavaScript不是按面向对象的思想设计的程序语言,所以它不具备像现有的面向对象的语言那样的功能,但是面向对象的思想是如此的深入人心,以至于JavaScript也削......
  • 再读《悟透javascript》之五、五子棋
    前言     五子棋是个很有趣的游戏,在用javascript开发之后,我发现其实ai算法才是最难的,这里的ai算法是直接借鉴自其它的ai算法。  代码如下:<htmlxmlns="http://www.w3......
  • 《悟透javascript》学习笔记:四、函数的魔力
    引言 JavaScript的代码就只有function一种形式,function就是函数的类型。也许其他编程语言还有procedure或method等代码概念,但在JavaScript里只有function一种形......
  • 再读《悟透javascript》之四、贪吃蛇
    前言     贪吃蛇是个很简单的小游戏,但是却很有趣,下面是我用JavaScript写的一个贪吃蛇的代码:  代码如下:   <htmlxmlns="http://www.w3.org/1999/xhtml"><headr......
  • 《悟透javascript》学习笔记:一、前言
    《悟透JavaScript》学习笔记  这是一本很形象生动的书,使我们可以更深地了解了JavaScript。 引言   编程世界里只存在两种基本元素,一个是数据,一个是代码。编程世界就......