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

( “树” 之 前中后序遍历) 145. 二叉树的后序遍历 ——【Leetcode每日一题】

基础概念:前中后序遍历

    1/ \2   3/ \   \
4   5   6
  • 层次遍历顺序:[1 2 3 4 5 6]
  • 前序遍历顺序:[1 2 4 5 3 6]
  • 中序遍历顺序:[4 2 5 1 3 6]
  • 后序遍历顺序:[4 5 2 6 3 1]

层次遍历使用 BFS 实现,利用的就是 BFS 一层一层遍历的特性;而前序、中序、后序遍历利用了 DFS 实现。

前序、中序、后序遍只是在对节点访问的顺序有一点不同,其它都相同。

① 前序

void dfs(TreeNode root) {visit(root);dfs(root.left);dfs(root.right);
}

② 中序

void dfs(TreeNode root) {dfs(root.left);visit(root);dfs(root.right);
}

③ 后序

void dfs(TreeNode root) {dfs(root.left);dfs(root.right);visit(root);
}

145. 二叉树的后序遍历

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

在这里插入图片描述

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

示例 2:

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

示例 3:

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

提示:

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

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

思路:

法一:DFS

  • 递归,见上面的基础概念。

法二:迭代

后序的迭代遍历可以理解成 ” 前序遍历 “反转:(前序遍历)

  • 这个 ”前序遍历 “ 的遍历顺序为:根节点,右子树、左子树

代码:(Java、C++)

法一:递归
Java

/*** 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> ans = new ArrayList<>();public List<Integer> postorderTraversal(TreeNode root) {dfs(root);return ans;}public void dfs(TreeNode root){if(root == null) return;dfs(root.left);dfs(root.right);ans.add(root.val);}
}

C++

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> ans;vector<int> postorderTraversal(TreeNode* root) {dfs(root);return ans;}void dfs(TreeNode* root){if(root == nullptr) return;dfs(root->left);dfs(root->right);ans.push_back(root->val);}
};

法二:迭代
Java

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();if(root == null) return ans;Stack<TreeNode> stk = new Stack<>();stk.push(root);while(!stk.isEmpty()){root = stk.pop();ans.add(root.val);if(root.left != null) stk.push(root.left);if(root.right != null) stk.push(root.right);}Collections.reverse(ans);return ans;}
}

C++

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {vector<int> ans;if(root == nullptr) return ans;stack<TreeNode*> stk;stk.push(root);while(!stk.empty()){root = stk.top();stk.pop();ans.push_back(root->val);if(root->left != nullptr) stk.push(root->left);if(root->right != nullptr) stk.push(root->right);}reverse(ans.begin(), ans.end());return ans;}
};

运行结果:

在这里插入图片描述

复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 是二叉树的节点数。每一个节点恰好被遍历一次。
  • 空间复杂度 O ( n ) O(n) O(n),为递归或迭代过程中栈的开销,平均情况下为 O ( l o g ⁡ n ) O(log⁡n) O(logn),最坏情况下树呈现链状,为 O ( n ) O(n) O(n)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!

相关文章:

( “树” 之 前中后序遍历) 145. 二叉树的后序遍历 ——【Leetcode每日一题】

基础概念&#xff1a;前中后序遍历 1/ \2 3/ \ \ 4 5 6层次遍历顺序&#xff1a;[1 2 3 4 5 6]前序遍历顺序&#xff1a;[1 2 4 5 3 6]中序遍历顺序&#xff1a;[4 2 5 1 3 6]后序遍历顺序&#xff1a;[4 5 2 6 3 1] 层次遍历使用 BFS 实现&#xff0c;利用的就是 BFS…...

NPOI與Crystal report 13.0關於ICSharpCode.SharpZipLib控件版本衝突的解決方法

公司原來的系統用了Crystal report 13.0&#xff0c;它關聯使用ICSharpCode.SharpZipLib.dll &#xff08;壓縮控件&#xff09;的版本為0.85.1.271&#xff1b;後來因需要新增加 NPOI2.3控件&#xff0c;它關聯使用了ICSharpCode.SharpZipLib.dll 的版本為 高版本0.86&#xf…...

Sass @extend 与 继承

Sass extend 与 继承 extend 指令告诉 Sass 一个选择器的样式从另一选择器继承。 如果一个样式与另外一个样式几乎相同&#xff0c;只有少量的区别&#xff0c;则使用 extend 就显得很有用。 以下 Sass 实例中&#xff0c;我们创建了一个基本的按钮样式 .button-basic&#…...

权限控制导入到项目中

在项目中应用 进行认证和授权需要前面课程中提到的权限模型涉及的7张表支撑&#xff0c;因为用户信息、权限信息、菜单信息、角色信息、关联信息等都保存在这7张表中&#xff0c;也就是这些表中的数据是进行认证和授权的依据。所以在真正进行认证和授权之前需要对这些数据进行…...

CVPR2020:训练多视图三维点云配准

CVPR2020&#xff1a;训练多视图三维点云配准 Learning Multiview 3D Point Cloud Registration 源代码和预训练模型&#xff1a;https://github.com/zgojcic/3D_multiview_reg 论文地址&#xff1a; https://openaccess.thecvf.com/content_CVPR_2020/papers/Gojcic_Learn…...

string容器及其简单使用

string容器 概述声明和初始化获取字符串长度字符串拼接字符串比较字符串插入和删除字符串转换 概述 string是C中的一个标准库容器&#xff0c;用于处理字符串。它提供了一系列的操作函数&#xff0c;使得我们可以像处理其他容器一样方便地处理字符串。下面是string容器的详细介…...

芴甲氧羰酰基-氨基-聚乙二醇-巯基吡啶Fmoc-NH-PEG-OPSS

修饰性PEG芴甲氧羰基-氨基-聚乙二醇-巯基吡啶Fmoc-NH-PEG-OPSS是保护氨基的PEG衍生物之一 结构式&#xff1a; 芴甲氧羰酰基-氨基-聚乙二醇-巯基吡啶Fmoc-NH-PEG-OPSS聚乙二醇化可以提高聚乙二醇分子的稳定性&#xff0c;降低其免疫原性&#xff0c;仅用于科研实验。 FMOC-NH…...

【JavaWeb】Servlet(崔老师版)

文章目录 1.概述1.1 JavaWeb三大组件1.2 Servlet作用 2.ServletConfig接口3.Servlet接口3.1 实现Servlet的方式3.2 Servlet生命周期 4.HttpServlet抽象类5.ServletContext5.1 概述5.2 获取ServletContext5.3 JavaWeb四大域对象5.4 获取应用初始化参数5.5 ServletContext获取资源…...

ITSS服务经理 、服务工程师线上开班在即

为了促进企业信息技术服务-运行维护服务能力&#xff0c;全面系统的提升员工的IT服务知识和技能水平&#xff0c;且更好的满足参训企业的时间需求&#xff0c;我司将于5月份开展ITSS服务经理、服务工程师线上班。 日期和形式 五月份&#xff1a;ITSS服务项目经理&#xff1a;…...

【LeetCode】199.二叉树的右视图

1.问题 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3: 输入: [] 输出: []…...

Shell编程(三)grep sed awk文本处理三剑客

上一章&#xff1a; Shell编程(二&#xff09;_做测试的喵酱的博客-CSDN博客 一、ps命令 指令&#xff1a; ps作用&#xff1a; 主要是查看服务器的进程信息选项含义&#xff1a; -e&#xff1a;等价于 ‘-A’ &#xff0c;表示列出全部的进程 -f&#xff1a;显示全部的列&am…...

一步步带你学习Python编程:从零开始的查缺补漏

在快节奏的生活中&#xff0c;很难找到时间来学习新的技能。但有时候&#xff0c;我们会突然发现自己有一些空闲时间&#xff0c;而又不想虚度光阴。无聊的时候&#xff0c;我们可以选择学习一项新技能来充实自己。最近&#xff0c;我就因为有些无聊&#xff0c;决定重新学习Py…...

常见容器的方法

常见容器 向量 (vector)常用方法代码实例 列表 (list)常用方法 集合 (set)常用方法 映射 (map)方法 向量 (vector) 常用方法 vector::push_back(): 将元素插入向量尾部。 vector::pop_back(): 弹出向量尾部的元素。 vector::insert(): 在指定位置插入元素。 vector::erase():…...

【Linux】线程

1.理解地址空间和页表 1.地址空间是进程能够看到的资源窗口 2.页表决定进程真正拥有的资源情况 3.合理的对地址空间和页表进行资源划分就可以对一个进程的所有资源进行划分&#xff1a;过地址空间分为栈区、堆区…通过页表映射到不同的物理内存。 在32位平台下&#xff0c;…...

ASP.NET Core MVC 从入门到精通之wwwroot和客户端库

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…...

Oracle OCI 修改 Compute Instance Hostname

Oracle OCI 修改 Compute Instance Hostname Oracle Linux 7 及之后的版本 Oracle Linux 7 及之后的版本 1, Update the /etc/hostname file with below command. hostnamectl set-hostname <new name>2, Edit the oci configuration file for hostnames as given belo…...

垃圾收集算法面试总结

垃圾收集算法 标记 - 清除算法 首先标记出所有需要被回收的对象&#xff0c;标记完后统一回收所有被标记的对象。 后续的收集算法都是基于这种思路并对其不足进行改进而得到的。 这种方法主要有两个缺点&#xff1a; 一个是效率问题&#xff0c;标记和清除两个过程的效率都…...

grep替换指定字符串方法

在 Linux 命令行中&#xff0c;可以使用 grep 命令来查找匹配某个模式的字符串&#xff0c;并将其替换为另一个字符串。具体方法如下&#xff1a; grep -rl <pattern> <directory> | xargs sed -i s/<old_string>/<new_string>/g其中&#xff0c;<…...

主从模式、哨兵模式、集群模式(cluster)

主从模式、哨兵模式、集群模式&#xff08;cluster&#xff09; redis 实现高可用的方式分为 主从模式、哨兵模式、集群模式&#xff08;cluster&#xff09; 1. 主从模式&#xff08;又称为主从复制&#xff09; 表现为1个主节点&#xff0c;多个从节点&#xff0c;主节点负…...

题目3180:蓝桥杯2023年第十四届省赛真题-互质数的个数======及探讨互质专题

原题链接 https://www.dotcpp.com/oj/problem3162.html 想直接看题解的&#xff0c;跳转到第三次尝试即可。 已AC。 解析&#xff1a; &#xff08;1&#xff09;首先大家要知道什么叫互质&#xff1a; 以及它们的性质&#xff1a; 欧拉函数 在数论中&#xff0c;对正整…...

解锁戴森电池3大突破:固件破解技术让32次红灯故障电池重生

解锁戴森电池3大突破&#xff1a;固件破解技术让32次红灯故障电池重生 【免费下载链接】FU-Dyson-BMS (Unofficial) Firmware Upgrade for Dyson V6/V7 Vacuum Battery Management System 项目地址: https://gitcode.com/gh_mirrors/fu/FU-Dyson-BMS 当你的戴森吸尘器突…...

三相LCL型并网逆变器:电容电流反馈与全前馈电网电压控制策略研究,谐波THD优化至5%以下的相...

三相lcl型并网逆变器控制策略 电容电流反馈和电网电压全前馈&#xff0c;加入5.7.11.13次谐波thd&#xff1c;5。 相关方面电力电气工程&#xff0c;电子信息工程等等都可以。最近在调试三相LCL并网逆变器时发现个有意思的现象&#xff1a;当电网背景谐波严重时&#xff0c;常规…...

英飞凌TC387/TC264芯片GTM模块实战:如何用ARU实现灵活定时器配置

英飞凌TC387/TC264芯片GTM模块实战&#xff1a;如何用ARU实现灵活定时器配置 在嵌入式系统开发中&#xff0c;定时器资源的灵活配置一直是工程师面临的挑战。英飞凌TC387和TC264芯片内置的GTM&#xff08;Generic Timer Module&#xff09;模块&#xff0c;凭借其ARU&#xff0…...

Windows安全中心总提示驱动不兼容?手把手教你清理老旧驱动,为内存完整性扫清障碍

Windows驱动深度清理指南&#xff1a;彻底解决内存完整性兼容性问题 每次打开Windows安全中心&#xff0c;那个刺眼的"驱动不兼容"提示总让人心烦&#xff1f;这不仅仅是烦人的弹窗问题&#xff0c;更是系统安全与性能的潜在威胁。作为长期使用Windows的资深用户&…...

Dify工作流HTTP请求配置全攻略:从基础到进阶的系统优化指南

Dify工作流HTTP请求配置全攻略&#xff1a;从基础到进阶的系统优化指南 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程&#xff0c;自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-…...

腾讯云/阿里云服务器上,用娃娃一键端30分钟搞定DNF私服(附端口安全组避坑指南)

腾讯云/阿里云30分钟极速部署DNF私服全攻略&#xff1a;从安全组配置到五国启动 最近在游戏开发者社区里&#xff0c;不少朋友都在讨论如何在云服务器上快速搭建DNF私服体验服。作为一名长期混迹于各类游戏私服搭建的老玩家&#xff0c;我发现大多数教程要么过于专业化&#xf…...

【Isaac Sim 4.5.0】从安装到启动:Ubuntu环境下的疑难杂症排查与修复实录

1. 环境准备&#xff1a;从零搭建Isaac Sim的硬件与软件基础 在Ubuntu系统上部署Isaac Sim之前&#xff0c;硬件兼容性检查是避免后续问题的关键第一步。我的RTX 4090显卡在安装过程中就遇到了显存识别问题&#xff0c;后来发现是PCIe供电不足导致的性能降频。建议先用lspci -…...

nRF Connect扫描功能保姆级教程:从过滤广播数据到分析RSSI信号图,手把手教你精准定位蓝牙设备

nRF Connect扫描功能实战指南&#xff1a;从设备筛选到信号优化的全流程解析 当你面对展会现场上百个闪烁的蓝牙设备指示灯&#xff0c;或是实验室里数十个同型号的传感器节点时&#xff0c;如何快速锁定目标设备就像大海捞针。nRF Connect作为蓝牙开发者的瑞士军刀&#xff0c…...

华硕笔记本终极性能调校指南:GHelper开源控制工具完全解析

华硕笔记本终极性能调校指南&#xff1a;GHelper开源控制工具完全解析 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目…...

Source Han Serif CN完全攻略:企业级中文字体的零成本解决方案

Source Han Serif CN完全攻略&#xff1a;企业级中文字体的零成本解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字设计与开发领域&#xff0c;中文字体的选择一直是平衡…...