当前位置: 首页 > article >正文

二叉树的前、中和后序遍历的递归与迭代实现

1. 前序遍历

1.1 递归

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var preorderTraversal = function(root) {
    let result = []
    traversal(root, result)
    return result
};

function traversal(root, res) {
    if(root == null) return
    res.push(root.val)
    traversal(root.left, res)  // 左子树
    traversal(root.right, res)  // 右子树
}

1.2 迭代

var preorderTraversal = function (root) {
    if (root == null) return []
    let result = []
    let stash = [root]
    while (stash.length) {
        const curNode = stash.pop()
        // 第一步的时候 先访问根节点
        result.push(curNode.val)

        // 现加入栈的是右子树然后再是左子树 这样从栈中先弹出的就是左子树 后弹出的才子右子树
        if (curNode.right) stash.push(curNode.right)
        if (curNode.left) stash.push(curNode.left)
    }
    return result
};

2. 中序遍历

2.1 递归

var inorderTraversal = function(root) {
    let result = []
    let traversal = (node, res) => {
        if(node == null) return
        // 左
        traversal(node.left, res)
        // 中
        res.push(node.val)
        // 右
        traversal(node.right, res)
    }

    traversal(root, result)

    return result
};

2.2 迭代

var inorderTraversal = function (root) {
    let result = []

    let stash = []

    let node = root

    while (node || stash.length) {
        // 遍历左子树
        while (node) {
            stash.push(node)
            node = node.left
        }
        // 中
        node = stash.pop()
        result.push(node.val)
        // 右
        node = node.right
    }

    return result
};

3. 后序遍历

3.1 递归

var postorderTraversal = function(root) {
    let result = []

    let traversal = (node, res) => {
        if(node == null) return
        // 左
        traversal(node.left, res)
        // 右
        traversal(node.right, res)
        // 中
        res.push(node.val)
    }
    
    traversal(root, result)

    return result
};

3.2 迭代

var postorderTraversal = function (root) {
    if(!root) return []

    let result = []
    let stash = [root]

    while (stash.length) {
        let curNode = stash.pop()

        result.unshift(curNode.val)   // 核心unshift
        if (curNode.left) stash.push(curNode.left)
        if (curNode.right) stash.push(curNode.right)

    }

    return result
};


http://www.kler.cn/a/159793.html

相关文章:

  • 【Java语言】String类
  • JavaScript 观察者设计模式
  • vscode远程连接服务器并启用tmux挂载进程
  • 记录使用documents4j来将word文件转化为pdf文件
  • python 同时控制多部手机
  • Django基础用法+Demo演示
  • Springboot 项目关于版本升级到 3.x ,JDK升级到17的相关问题
  • Boost:asio捕获信号
  • 【BroadcastReceiver】
  • 排序:直接插入排序希尔排序
  • 【Docker】从零开始:13.Docker安装tomcat
  • 猫头虎分享已解决Bug || 报错npm ERR! A complete log of this run can be found in: npm ERR!
  • 8个Python高效数据分析的技巧!
  • 【链表Linked List】力扣-24 两两交换链表中的节点
  • Python小案例:while练习题
  • css 3D背景反转实现
  • 品牌要随时监测电商价格现实吗
  • uniapp打包iOS应用并通过审核:代码混淆的终极解决方案 ✨
  • pytorch学习6-非线性变换(ReLU和sigmoid)
  • 电力仪表在工厂车间设备电能管理系统的设计-安科瑞黄安南
  • uView ui 1x uniapp 表格table行内容长度不一导致高度不统一而出现的不对齐问题
  • 信息系统安全运维服务资质认证申报流程详解
  • 游戏:火星孤征 - deliver us mars - 美图秀秀~~
  • 【SQLite】SQLite3约束总结
  • 服务器数据恢复—重装系统导致XFS文件系统分区丢失的数据恢复案例
  • bpftrace原理与使用方法