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

news2025/4/5 15:00:12

基础概念:前中后序遍历

    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专栏,每日更新!

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

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

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

相关文章

Git从远程仓库克隆仓库后推送到指定分支

git克隆到本地仓库 在得到一个git仓库地址后&#xff0c;首先要配置本地仓库&#xff0c;配置远程仓库地址才可以远程拉取项目。 本地配置的一般流程&#xff1a; git init初始化一个空白git仓库 2. 配置在自己额用户名和邮箱 配置个人信息时方便再团队合作时能知道是谁再何…

2023 CCBN广电展顺利召开,ATEN宏正携广电专属系列解决方案亮相

4月19日-4月21日&#xff0c;第二十九届中国国际广播电视信息网络展览会(CCBN2023)于北京市石景山区首钢会展中心盛大开幕。本届CCBN广电展以“大视听向未来”为主题&#xff0c;内容涵盖广播电视、网络视听、电影、信息化视听、视听消费电子、通信、IT等多个领域创新科技和行业…

MySQL高级第十三篇:MySQL事物日志(redo日志-undo日志执行流程)

MySQL高级第十三篇&#xff1a;MySQL事物日志&#xff08;redo日志-undo日志执行流程&#xff09; 一、概述二、redo 日志1. 为什么需要 redo日志&#xff1f;2. redo 日志的特点3. redo log 整体流程4. redo log 的刷盘策略&#xff1f; 三、undo 日志1. 什么是 undo 日志&…

1026. 节点与其祖先之间的最大差值(4-19日

题目&#xff1a;给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val|&#xff0c;且 A 是 B 的祖先。 &#xff08;如果 A 的任何子节点之一为 B&#xff0c;或者 A 的任何子节点是 B 的祖先&#xff0c;那么…

context 浅析

在缺少直接调用关系的两个函数之间传递数据&#xff0c;一般都会考虑使用 context&#xff0c;而 context 也被用来存储整个请求链路的公参信息&#xff0c;用户 uid、链路 traceID、特定的业务参数等。函数第一个参数类型设置为 context.Context 也是 Go 的默认写法&#xff0…

2 常见模块库(3)

2.9 积分模块&#xff08;2&#xff09; External reset: 在什么条件下进行外部重置操作描述一下每个选项&#xff1a; Rising&#xff1a;当重置信号从非正的值&#xff08;0或负值&#xff09;变为正值时&#xff0c;重置积分器的状态。 Falling&#xff1a;当重置信号从正…

Java每日一练(20230419)

目录 1. 二叉树的最大深度 &#x1f31f; 2. 二叉树的层序遍历 &#x1f31f;&#x1f31f; 3. 最短回文串 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Jav…

双向带头循环链表的实现

双向带头循环链表 双向带头循环链表结构讲解期望实现功能创建链表和头节点作用头插和头删头插头删 尾插与尾删尾插尾删 pos 删除和插入插入删除 打印和查找 整体代码 这个数据结构可以算是YYDS的存在了。 我们前面讲过的单链表&#xff0c;尾删和尾插需要遍历数组&#xff0c;极…

是时候该换掉你的axios了

axios是一个基于Promise的HTTP客户端&#xff0c;每周的npm下载量4000W&#xff0c;如果回到在10年前&#xff0c;promise式的请求工具是一个很大的创新&#xff0c;它解决了请求繁琐的问题&#xff0c;在那个性能要求不那么高的年代可谓是一骑绝尘。但随着时间的推移&#xff…

【网络】UDP协议 TCP协议

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【网络】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文章…

Centos7安装Elasticsearch6.4.3和Kibana6.4.3

一、下载好安装文件上传到/usr/local 二、安装Java环境 1&#xff09;、解压jdk tar -zxvf jdk-8u181-linux-x64.tar.gz2&#xff09;、 配置Java环境变量 vim /etc/profile 3&#xff09;、profile末尾添加 export JAVA_HOME/usr/local/jdk1.8.0_181 export PATH$JAVA_HO…

【2023 · CANN训练营第一季】昇腾AI入门课(Pytorch)---昇腾AI入门课(PyTorch)微认证考试

1、下列不属于昇腾计算服务层的是() 2、AscendCL的优势包括() 3、使用AscendCL开发应用的基本流程&#xff0c;以下正确的是&#xff1f; 4、关于AscendCL初始化&#xff0c;以下说法不正确的是&#xff1f; 5、以下关于ATC工具说法正确的是 6、模型转换工具的名称是&#xf…

深入实战探究 Vue 2.7 Composition API 的强大之处

最近几年公司开发一直使用的是 Vue2.6&#xff0c;对于逻辑复用使用的是 Mixin 方式&#xff0c;但随着项目体量的增加&#xff0c;带了一些问题&#xff0c;特别是&#xff1a;数据混乱问题&#xff1a;实例上的数据属性从当前模板文件中无法查取到&#xff0c;存在多个 Mixin…

API 鉴权都有哪些分类,这些重点不要错过

API鉴权是保证API安全性和可用性的一项重要措施。通过API鉴权&#xff0c;系统可以对用户或者应用进行有效的身份认证和权限管理。一般来说&#xff0c;在实际开发中&#xff0c;我们使用以下几种API鉴权方式&#xff1a; 1. 基本认证 基本认证是API鉴权的一种最基本形式。此方…

如何创建Spring项目

创建Spring项目 创建一个Maven项目 这里使用的是2023版本的idea。 添加Spring框架支持 在项目的pom.xml中添加Spring支持。这里可以到中央仓库找一下。 <dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dep…

Android Binder 图文解释和驱动源码分析

前言 最近在学习Binder&#xff0c;之前都是跳过相关细节&#xff0c;通过阅读文章对Binder有了一些认识&#xff0c;但是并没有真正理解Binder。如果要深入理解Framework的代码&#xff0c;就必须要真正理解Binder。 我学习Binder的方法&#xff1a; 一边阅读Gityuan的Bind…

视觉语言模型究竟能帮助我们完成哪些工作?

当前&#xff0c;多模式人工智能已经成为一个街谈巷议的热门话题。随着GPT-4的最近发布&#xff0c;我们看到了无数可能出现的新应用和未来技术&#xff0c;而这在六个月前是不可想象的。事实上&#xff0c;视觉语言模型对许多不同的任务都普遍有用。例如&#xff0c;您可以使用…

vmware VM虚拟机去虚拟化教程 硬件虚拟机 过鲁大师检测

一 准备工作 1. 这里演示的VM虚拟机版本是12.5.9 虚拟机系统是win7 64位 2. 用到的工具 winhex和Phoenix BIOS Editor 下载地址工具 链接&#xff1a;https://pan.baidu.com/s/1b3FfA3FyQ_lnFQSjpCGLGg?pwd1221 提取码&#xff1a;1221 3. 注意&#…

【2023 · CANN训练营第一季】昇腾AI入门课(Pytorch)---昇腾AI入门课(上)

AscendCL快速入门 AscendCL概述 AscendCL功能介绍 AscendCL基础概念解析 应用开发流程 样例代码精讲

Vivado综合参数设置

如果你正在使用Vivado开发套件进行设计&#xff0c;你会发现综合设置中提供了许多综合选项。这些选项对综合结果有着潜在的影响&#xff0c;而且能够提升设计效率。为了更好地利用这些资源&#xff0c;需要仔细研究每一个选项的功能。本文将要介绍一下Vivado的综合参数设置。 …