数据结构与算法之二叉树: Leetcode 145. 二叉树的后序遍历 (Typescript版)

2023-11-01

二叉树的后序遍历

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

描述

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

示例 1

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

示例 2

输入:root = []
输出:[]

示例 3

输入:root = [1]
输出:[1]

提示

  • 树中节点的数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶:递归算法很简单,你可以通过迭代算法完成吗?

算法实现

1 )方案 1

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function postorderTraversal(root: TreeNode | null): number[] {
    const result: number[] = []
    const isValid = (val: any) => val !== null;
    const postorderHandler = (root: TreeNode | null) => {
        if(!root) return result;
        isValid(root.left) && postorderHandler(root.left);
        isValid(root.right) && postorderHandler(root.right);
        isValid(root.val) && result.push(root.val);
        return result;
    }
    return postorderHandler(root)
};
  • 同前序和中序,这是递归版,递归版真香, 代码及其简洁, 缺点也很明显
  • 后续遍历特点
    • 对根节点的左子树进行后续遍历
    • 对根节点的右子树进行后续遍历
    • 访问根节点
  • 记忆:左右根

2 )方案 2

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function postorderTraversal(root: TreeNode | null): number[] {
    if(!root) return [];
    const res: number[] =[];
    const stack: TreeNode[] = [];
    let cur = root;
    stack.push(root);
    while(stack?.length) {
        cur = stack.pop()!;
        res.push(cur.val);
        if(cur.left) stack.push(cur.left);
        if(cur.right) stack.push(cur.right);
    }
    return res.reverse();
};
  • 这是官方提供的示例,迭代版本,使用栈的特性:后进先出
  • 这里用到一个逆向思维,从顶点开始,而非从叶子节点开始
  • 根节点值先进栈,之后左节点入栈,之后右节点入栈
  • 当while继续时,右节点先出栈(后进先出) 并压进结果栈
  • 之后继续找右节点的左右节点,循环处理,直到没有孩子节点
  • 在一个最小规模的场景下,比如一棵树只有左右根,那么这个顺序就是
  • 根右左,这是最小规模的场景,也是我们的切入点
  • 这样reverse之后就是 左右根 这样的顺序了
  • 之前是从根节点开始的,这样就把顺序捋正了,从叶子节点开始
  • 这个是一种新的思路

3 )方案

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function postorderTraversal(root: TreeNode | null): number[] {
    const ans = <number[]>[]; // 存放最终集合
    const stack = <TreeNode[]>[]; // 存放树节点集合的栈
    let cur = root; // 当前节点
    while(cur || stack.length) {
        while(cur) {
            ans.push(cur.val); // 根的值
            stack.push(cur);
            cur = cur.right;  // 右节点
        }
        if(stack.length){
            cur = stack.pop();
            cur = cur.left; // 左节点
        }
    }
    return ans.reverse();
}
  • 这是前序遍历方案2和本方案2结合的思路
  • 先访问最深层根叶子节点,用一个栈进行来回捯饬
  • 最后在用一个reverse进行反转,这也提供一种新的思路
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法之二叉树: Leetcode 145. 二叉树的后序遍历 (Typescript版) 的相关文章

随机推荐

  • 从零开始制作游戏外挂

    一 什么叫外挂 现在的网络游戏多是基于Internet上客户 服务器模式 服务端程序运行在游戏服务器上 游戏的设计者在其中创造一个庞大的游戏空间 各地的玩 家可以通过运行客户端程序同时登录到游戏中 简单地说 网络游戏实际上就是由游戏开发商提
  • 【专题】我们常用的功能自动化测试工具——Selenium篇

    导语 Selenium也是一个用于Web应用程序测试的工具 Selenium测试直接运行在浏览器中 就像真正的用户在操作一样 支持的浏览器包括IE Mozilla Firefox Mozilla Suite等 这个工具的主要功能包括 测试与
  • 备赛电赛学习硬件篇(二):电源板电路设计

    目录 一 接口 二 稳压部分 三 防反接电路 四 电流与线宽 一 接口 1 输入接口 要准
  • 调试osgEarth(33)分页瓦片卸载器子节点的作用-(3)渲染遍历的帧号和时间设置-TerrainCuller赋值给可渲染图层--TerrainRenderData-Layer

    继续调试 再回顾下Layer类的成员变量 就是说 初始化时调用init 添加到Map上时 setReadOptions gt open gt addedToMap 移除时用removedFromMap 总结下 Layer是个基类 有自己的唯
  • MATLAB实现doc文件的批量改名

    对于一个文件夹中的多个doc文件进行批量改名 下图中是笔者从学生那里收上来的记录表 说了要统一命名也没人听 我又懒得一个个改 只好费点时间编程了 两种实现的思路 一是从旧文件名中选取特定位置的字符 组成新的文件名 要求文件名有固定的位置 比
  • Swift之 ? 和 !

    04 June 2014 Swift语言使用var定义变量 但和别的语言不同 Swift里不会自动给变量赋初始值 也就是说变量不会有默认值 所以要求使用变量之前必须要对其初始化 如果在使用变量之前不进行初始化就会报错 var stringV
  • 产品设计七大定律

    Alan Cooper 交互设计之父 除非有更好的选择 否则就遵从标准 许多设计准则都基于人类心理学 人们如何感知 学习 推理 记忆 以及把意图转换为行动 菲茨定律 菲茨定律用来预测某点到目标位置所需要时间的数学模型 在页面中 大而近的目标
  • 共模电感

    一 背景 关电源会产生以下两类噪声 共模和差模 差模噪声 图a 的传播途径和输入电流相同 共模噪声 图b 表现为彼此相等且同相的噪声 其传播途径经绕组与地线相连 本文主要讲解抑制共模的共模电感的磁芯选择 二 共模电感的抑制原理 电感器对高频
  • Qt5 Qstring::asprintf(“%.3f“, a)精度问题,有时四舍五入,有时直接丢弃。

    问题描述 提示 这里描述具体问题 在Qt5 12开发软件时发现 用Qstring asprintf 3f a 这个函数做精度控制 有时直接四舍五入 有时直接将精度后面的数据拿掉 例如 Qstring asprintf 3f a 四舍五入 f
  • 机器学习算法 决策树

    文章目录 一 决策树的原理 二 决策树的构建 2 1 ID3算法构建决策树 2 2 C4 5 算法树的构建 2 3 CART 树的创建 三 决策树的优缺点 一 决策树的原理 决策树 Decision Tree 是一种非参数的有监督学习方法
  • 10.12黄金原油资讯直通车,黄金原油区间震荡后市操作建议

    黄金消息面与技术面解析 消息面 本周显然又是一个 超级周 数据方面 将迎来中国CPI PPI数据和进出口数据 美国将公布CPI PPI 零售销售等重磅经济数据 风险事件方面 OPEC EIA和IEA都将公布原油市场月度报告 美联储多位票委和
  • eslint+prettier+vue3格式化

    项目里面安装并配置eslint 参考官网执行如下命令 npm init eslint config 等价于 npm install eslint D 安装eslint npx eslint init 初始化配置eslint 执行后会有一些配
  • 【论文笔记】:UnitBox

    Title 2016 ACM MM UnitBox An Advanced Object Detection Network Abstract 传统的目标框含有四个独立的坐标变量 丢失了相互之间的信息 导致AP下降 Unit Box 提出了
  • java操作RabbitMQ

    1 创建虚拟主机 交换机 队列 RabbitMQ提供了自己的管理界面 可以通过管理界面来完成VirtualHost Exchange queue的创建 1 1创建VirtualHost 1 2创建交换机 创建交换机的时候需要指定虚拟主机以及
  • 切换默认python版本(解决ROS中python默认版本为python2的问题)

    1 前言 许多小伙伴在安装完ROS以后 需要基于python3写ROS程序 尤其是部署深度学习算法 但是ROS默认的python版本为python2 导致无法兼容一些基于python3写的算法 有的小伙伴会选择利用anaconda来创建py
  • 蓝桥杯单片机之AT24C02模块的使用

    蓝桥杯单片机之AT24C02时钟模块的使用 简介部分 EEPROM AT24C02 引脚示意 设备地址 Device Address 基本操作 字节写入 分析手册 字节读取 随机读取 根据需要读取的地址进行读取 分析手册 读与写函数代码 实
  • 计算并输出给定正整数n的所有因子(不包括1和自身)之和

    国二有题目 请编写函数fun 该函数的功能是 计算并输出给定正整数n的所有因子 不包括1和自身 之和 规定n的值不大于1000 例如 在主函数中从键盘给n输入的值为856 则输出为 sum 763 代码如何完成呢 分析 1 输入的数字要是整
  • 内网渗透—红日靶场三

    文章目录 0x01 环境配置 0x02 Centos getshell 0x03 Centos提权 0x04 内网穿透 设置路由 0x05 内网穿透 设置代理 0x06 获取内网目标shell 通过smb拿shell 或者本地挂代理使用k8
  • Windows环境下编译C++版的MXNet问题处理

    最近涉及要在c 上部署人脸检测的算法 要在Windows环境下编译运行MXNet 对于不熟悉c 的小白的我真是一件又让人抓狂又掉头发的事情 网上关于c 的部署的帖子少之又少 加上又是第一次摸这些东西 所以出现的bug真的数不胜数 写这个bl
  • 数据结构与算法之二叉树: Leetcode 145. 二叉树的后序遍历 (Typescript版)

    二叉树的后序遍历 https leetcode cn problems binary tree postorder traversal 描述 给你一棵二叉树的根节点 root 返回其节点值的 后序遍历 示例 1 输入 root 1 null