【LeetCode】145.二叉树的后续遍历

news2024/11/18 11:19:56

1.问题

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

示例 1:

在这里插入图片描述

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

示例 2:

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

示例 3:

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

提示

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

2.解题思路

二叉树的后序遍历规则:左-右-根,解题思路其实和前面两篇二叉树的前序遍历、二叉树的中序遍历差不太多.

2.1 递归

定义函数 postOrderTraversal(root)为遍历root节点。则调用顺序为:

postOrderTraversal(root.left);
postOrderTraversal(root.right);
root.val;

复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉搜索树的节点数。每一个节点恰好被遍历一次。

  • 空间复杂度:O(n),为递归过程中栈的开销,平均情况下为 O(log⁡n),最坏情况下树呈现链状,为 O(n)。

作者:力扣官方题解
链接:https://leetcode.cn/problems/binary-tree-postorder-traversal/solutions/431066/er-cha-shu-de-hou-xu-bian-li-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2.2 迭代

  1. 遍历root
    在这里插入图片描述
  2. root入栈
    在这里插入图片描述
    3)root.left入栈
    在这里插入图片描述
    4)root.left再无左子树了,左子树根节点出栈,遍历,并标记当前出栈的节点为已访问过,否则遍历、入栈root.right
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5)同理,先把4所有左节点入栈,到达最左节点后,出栈,遍历val,标记当前出栈的节点为已访问过,遍历root.right,出栈root.right,root.
在这里插入图片描述
5出栈
在这里插入图片描述
在这里插入图片描述
4出栈,但4的右节点存在,入栈4.right
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
7出栈,遍历,依次出栈4,3,遍历完毕
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉搜索树的节点数。每一个节点恰好被遍历一次。

  • 空间复杂度:O(n),为迭代过程中显式栈的开销,平均情况下为 O(log⁡n),最坏情况下树呈现链状,为 O(n)。

3.代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
	//迭代
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if (null == root) {
            return res;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode prev = null;
        TreeNode current = root;
        while (null != current || !stack.isEmpty()) {
            while (null != current) {
                stack.push(current);
                current = current.left;
            }
            //获取当前栈顶节点
            current = stack.peek();
            //右节点为空,或者已经访问过,则打印,并标记当前出栈的节点为已访问过
            if (null == current.right || prev == current.right) {
                res.add(current.val);
                prev = current;
                stack.pop();
                current = null;
            } else {
                current = current.right;
            }
        }
        return res;
    }
	
	//递归
	public int[] postorderTraversal2 (TreeNode root) {
        if (null == root) {
            return new int[0];
        }
        List<Integer> list = new ArrayList<Integer>();
        postorderTraversal2(list, root);
        return list.stream().mapToInt(Integer::valueOf).toArray();
    }
 
    public void postorderTraversal2 (List<Integer> list, TreeNode root) {
        if (null == root) {
            return;
        }
        postorderTraversal2(list, root.left);
        postorderTraversal2(list, root.right);
        list.add(root.val);
    }
}

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

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

相关文章

Linux搭建我的世界MC服务器 - MCSM面板 【外网远程联机教程】

文章目录 1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 Linux使用MCS…

程序地址空间(上)

目录 &#xff1a; 1.C/C程序地址空间回顾&#xff08;C语言&#xff09; 2.通过一段代码&#xff08;引出进程虚拟地址空间&#xff09; 3.进程虚拟地址空间是什么 ------------------------------------------------------------------------------------------------------…

项目制作4

今天对文件录入,进行了测试,结构体录入还是非常的好用的 对地图也有了新的制作,但是地图上的鼠标操作遇到了问题 难以解决,一搞就是内存问题给我下坏了 哎我选择认了,用控制台来显示公告算了 for (int j 1;j < f->Points;j) fread(&f->drops[j], sizeof(drop…

微服务---Docker的基本使用

Docker 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0c;环境不…

虹科分享 | 基于流的流量分类的工作原理 | 网络流量监控

许多ntop产品&#xff0c;如ntopng、nProbe和PF_RING FT等都是基于网络流的。然而&#xff0c;并不是所有的用户都详细知道什么是网络流&#xff0c;以及它在实践中是如何工作的。这篇博客文章描述了它们是什么以及它们在实践中是如何工作的。 什么是网络流量 网络流是一组具…

C++11新特性(下)

文章目录 1. 可变参数模板1.1 empalce相关接口函数 2. lambda表达式2.1 C98中的一个例子2.2 lambda表达式语法2.3 函数对象与lambda表达式 3. 包装器3.1 function包装器3.2 bind 1. 可变参数模板 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板。相比…

Matlab与ROS---Action与Gazebo(六)

0. 简介 对于ROS1而言&#xff0c;其在Matlab当中相较于ROS2还有一些比较高级的用法&#xff0c;比如说我们接下来要说的Action和Gazebo仿真。 1. ROS Action ROS的Action行为模式当中也存在有一个客户端到服务器的通信关系。Action行为模式使用ROS主题将目标消息从客户机发…

【技巧】飞书多维表格零代码连接飞书多维表格,实现表单自动同步

飞书多维表格用户使用场景&#xff1a; 在公司日常工作中&#xff0c;各个部门使用飞书多维表格记录签订合同、文件审核、归档等事务&#xff0c;常需要行政人员辅助处理&#xff0c;将这些子表单的数据汇总到一个总表单中。但每个部门对应的事务较为复杂&#xff0c;子表单数量…

OpenCV例程赏析

OpenCV例程赏析 ①SITF特征检测匹配(目标查找)例程&#xff1a;…\opencv\sources\samples\python2\find_obj.py(asift.py) #!/usr/bin/env python ‘’’ Feature-based image matching sample. Note, that you will need the https://github.com/opencv/opencv_contrib r…

什么是内容交付网络?

内容交付网络&#xff08;CDN&#xff09;是一个全球分布的网络服务器或存在点&#xff08;PoP&#xff09;&#xff0c;其目的是提供更快的内容交付&#xff0c;内容被复制并存储在整个CDN中&#xff0c;因此用户可以访问存储在地理上离用户最近的位置的数据。这与仅在一个中央…

Flinkx/Datax/Flink-CDC 优劣势对比

Flinkx/Datax/Flink-CDC 优劣势对比_HiBoyljw的博客-CSDN博客 一、FlinkX简介 FlinkX是一款基于Flink的分布式离线/实时数据同步插件&#xff0c;可实现多种异构数据源高效的数据同步&#xff0c;其由袋鼠云于2016年初步研发完成&#xff0c;目前有稳定的研发团队持续维护&…

微前端解决方案

目录 微前端解决方案微前端的整体架构微前端部署平台 微前端解决方案 在理想的情况下&#xff0c;期望能达到&#xff0c;将一个复杂的单体应用以功能或业务需求垂直的切分成更小的子系统&#xff0c;并且能够达到以下能力&#xff1a; 子系统间的开发、发布从空间上完成隔离…

java学员学生综合测评管理系统

目 录 摘 要 I ABSTRACT II 第一章 绪论 1 1.1课题背景 1 1.2目的和意义 1 1.3开发工具及技术 2 1.3.1开发工具 2 1.3.2 JSP技术 2 1.4软硬件需求 3 第二章 系统分析 5 2.1可行性分析 5 2.1.1技术可行性 5 2.1.2经济可行性 5 2.1.3操…

GrassRouter多链路聚合通信系统保障公路网络稳定全面覆盖解决方案

近年来国内经济不断发展&#xff0c;城市道路交通能力迅速提高&#xff0c;各省市道路交通体系不断完善&#xff0c;促使高速公路运能得到极大提高&#xff0c;公路运输的通达性、舒适性得到明显提高。随着现代化高速公路的建设&#xff0c;新一代无线网络监控系统&#xff0c;…

Jmeter控制器 Logic Controller

控制器包含&#xff1a; 1.Loop Controller 作⽤&#xff1a;指定其⼦节点运⾏的次数&#xff0c;可以使⽤具体的数值&#xff0c;也可以使⽤变量    Forever选项&#xff1a;表示⼀直循环下去   如果同时设置了线程组的循环次数和循环控制器的循环次数&#xff0c;那循环…

大屏使用echart开发省市地图,并点击省获取市地图

1. 本文在基础上进行改进&#xff0c;后端使用若依后端 IofTV-Screen: &#x1f525;一个基于 vue、datav、Echart 框架的物联网可视化&#xff08;大屏展示&#xff09;模板&#xff0c;提供数据动态刷新渲染、屏幕适应、数据滚动配置&#xff0c;内部图表自由替换、Mixins注…

ZooKeeper的安装和配置过程

ZooKeeper的安装和配置过程 ZooKeeper服务器是用Java创建的&#xff0c;它需要在JVM上运行&#xff0c;所以需要使用JDK1.6及以上版本。 查看是否安装了Java环境: java -version没有安装的先去安装JDK&#xff1a;Linux 安装 JDK 官网下载zooKeeper 官网下载zooKeeper&…

基于 YOLOv8 的自定义数据集训练

图1.1&#xff1a;YOLOv8初始测试 YOLOv8&#x1f525;于 2023年1月10日由Ultralytics发布。它在计算机视觉方面提供了进展&#xff0c;带来了对我们感知、分析和理解视觉世界的巨大创新。它将为各个领域带来前所未有的可能性。 在速度、准确性和架构方面进行了相当大的改进。它…

vs的常用配置【以及vs常用的快捷键】

1、颜色设置 (1) 编译器的主题颜色设置 (2) 字体和颜色设置 (3) 字体大小 更快捷的修改字体大小方式&#xff1a;ctr鼠标滚轮 2、行号设置 默认就有&#xff0c;不用设置了 3、把解决方案资源管理器移动到左边 4、设置打开错误列表 5、自动保存-要手动使用快捷键 ctrs 代码…

DolphinScheduler×T3出行 | 打造车联网一站式数据应用交互体验

点击蓝字 关注我们 用户案例 | T3 出行 业务挑战 作为一家车联网驱动的公司&#xff0c;T3出行汇聚了“人、车、路、云”各端的海量数据。为了承载如此多元化的数据以更好地释放数据价值&#xff0c;T3出行构建了以Apache Hudi为基础的企业级的数据湖&#xff0c;并在此之上搭建…