38-二叉树练习-LeetCode145二叉树的后序遍历

题目

给你一棵二叉树的根节点 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.
 * 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 {
   List<Integer> ret = new LinkedList<>();
   public List<Integer> postorderTraversal(TreeNode root) {
        if(root == null) {
            return ret;
        }
        postorderTraversal(root.left);
        postorderTraversal(root.right);
        ret.add(root.val);
        return ret;
    }
}

思路2:


代码2

/**
 * 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> ret = new LinkedList<>();
        if(root == null) {
            return ret;
        }
        Stack<TreeNode> stack = new Stack<>();
        //cur表示当前需要判断的节点
        TreeNode cur = root;
        //prev表示最近一次完全结束遍历的节点
        TreeNode prev = null;
        
        while(cur != null || !(stack.isEmpty())) {
            //一路向左走到头
            while(cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            //左树已经全部结束
            cur = stack.pop();
            
            //此时cur是第二次访问,不能直接遍历,需要判断右树是否为空或者是否遍历结束
            if(cur.right == null || prev == cur.right) {
                //右树已经结束遍历,第三次访问cur
                ret.add(cur.val);
                //此时cur已经全部访问完毕,prev更新为当前cur节点
                prev = cur;
                cur = null;
            } else {
                stack.push(cur);
                //继续访问右子树
                cur = cur.right;
            }
        }
        return ret;
    }
}

前、中、后序遍历借助栈实现,根节点啥时候能真正遍历输出?

  1. 前:第一次访问根节点就可以输出。
  2. 中:第二次访问根节点(走完左树)可以输出。
  3. 后:第三次访问根节点(走完子树)可以输出。

节点入栈和出栈:

  • 入栈:第一次走到节点入栈。
  • 出栈:当真正访问完这个节点出栈。(左、右、根)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

让chatGPT当我的老师如何? 通过和chatGPT交互式学习,了解在ES中,一条JSON数据是如何写到磁盘上的

最近一直有一个问题&#xff0c;如鲠在喉。争取早一天解决&#xff0c;早一天踏踏实实的睡觉。 问题是&#xff1a;在ES中&#xff0c;一条JSON数据是如何写入到磁盘上的&#xff1f; 如何解决这个问题&#xff1f;我想到了chatGPT&#xff0c;还有lucene的学习资料。这篇文章&…

【机器学习】决策树(理论)

决策树&#xff08;理论&#xff09; 目录一、何为决策树1、决策树的组成2、决策树的构建二、熵1、熵的作用2、熵的定义3、熵的计算4、条件熵的引入5、条件熵的计算三、划分选择1、信息增益&#xff08; ID3 算法选用的评估标准&#xff09;2、信息增益率&#xff08; C4.5 算法…

DetectGPT:使用概率曲率的零样本机器生成文本检测

DetectGPT的目的是确定一段文本是否由特定的llm生成&#xff0c;例如GPT-3。为了对段落 x 进行分类&#xff0c;DetectGPT 首先使用通用的预训练模型&#xff08;例如 T5&#xff09;对段落 ~xi 生成较小的扰动。然后DetectGPT将原始样本x的对数概率与每个扰动样本~xi进行比较。…

Springboot 多线程分批切割处理 大数据量List集合 ,实用示例

前言 哲学提问镇贴&#xff1a; 不了解异步怎么使用的看官&#xff0c; 可阅&#xff1a; SpringBoot 最简单的使用异步线程案例 Async_小目标青年的博客-CSDN博客 Springboot Async异步扩展使用 结合 CompletableFuture_小目标青年的博客-CSDN博客 想了解更多关于批量list处…

25- 卷积神经网络(CNN)原理 (TensorFlow系列) (深度学习)

知识要点 卷积神经网络的几个主要结构: 卷积层&#xff08;Convolutions&#xff09;: Valid :不填充&#xff0c;也就是最终大小为卷积后的大小. Same&#xff1a;输出大小与原图大小一致&#xff0c;那么N ​变成了​N2P. padding-零填充. 池化层&#xff08;Subsampli…

《程序员面试金典(第6版)》面试题 08.08. 有重复字符串的排列组合(回溯算法,全排列问题)C++

题目描述 有重复字符串的排列组合。编写一种方法&#xff0c;计算某字符串的所有排列组合。 示例1: 输入&#xff1a;S “qqe” 输出&#xff1a;[“eqq”,“qeq”,“qqe”] 示例2: 输入&#xff1a;S “ab” 输出&#xff1a;[“ab”, “ba”] 提示: 字符都是英文字母。…

Mybatis持久层框架 | Lombok搭建

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Lombok Lombok项目是一个java库&#xff0c;它可以自动插入到编辑器和构建工具中&#xff0c;增强java的性能。不需要再写getter、setter或equals方法&#xff0c;只要…

自然语言大模型介绍

1 简介 最近一直被大语言模型刷屏。本文是周末技术分享会的提纲&#xff0c;总结了一些自然语言模型相关的重要技术&#xff0c;以及各个主流公司的研究方向和进展&#xff0c;和大家共同学习。 2 Transformer 目前的大模型基本都是Transformer及其变种。本部分将介绍Transf…

【WEB前端进阶之路】 HTML 全路线学习知识点梳理(上)

前言 HTML 是一切Web开发的基础&#xff0c;本文专门为小白整理&#xff0c;针对前端零基础的朋友们&#xff0c;手把手教你学习HTML&#xff0c;让你轻松迈入WEB开发的行列。 首先&#xff0c;感谢 橙子_ 在HTML学习以及本文编写过程中对我的帮助。 文章目录前言一.HTML简介1.…

【NLP经典论文阅读】Efficient Estimation of Word Representations in Vector Space(附代码)

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

二值mask转polygon/RLE (coco segment格式)

coco数据集annotation的segmentation并不是二值mask&#xff0c;而是polygon格式&#xff0c; 看一个annotation. {"segmentation": [[510.66,423.01,511.72,420.03,510.45......]], #两两组成(x,y)坐标&#xff0c;polygon格式"area": 702.1057499999998…

腾讯自研万亿级NLP大模型,自动生成和衍生广告文案

编者按&#xff1a;随着大数据与AI技术的不断发展&#xff0c;人们越来越看见AI大模型在数据理解、运算以及诸多泛化能力上的潜力&#xff0c;时下&#xff0c;大模型已然成为学术界与工业界探索的重点方向。然而&#xff0c;随着模型规模与容量的不断扩大&#xff0c;其所需训…

mac 把word公式默认字体Cambria Math换成LaTex字体以及带章节自动编号

word默认是Cambria Math&#xff0c;想用latex那种公式的字体&#xff0c;这里使用的是XITS Math字体 搜了很多地方&#xff0c;都是用ab Text这个方法先转成文本&#xff0c;再换字体&#xff0c;然后设置斜体 可是公式多起来的话这种办法很麻烦&#xff0c;而且一个公式里常…

PyTorch深度学习实战 | 典型卷积神经网络

在深度学习的发展过程中&#xff0c;出现了很多经典的卷积神经网络&#xff0c;它们对深度学习的学术研究和工业生产都起到了巨大的促进作用&#xff0c;如VGG、ResNet、Inception和DenseNet等&#xff0c;很多投入实用的卷积神经都是在它们的基础上进行改进的。初学者应从试验…

C语言实现堆

注&#xff1a;这里我们所实现的是大根堆&#xff08;即父节点不小于子节点的堆&#xff09; 目录 一&#xff0c;堆的介绍 二&#xff0c;堆结构的创建 三&#xff0c;接口实现 1&#xff0c;初始化与销毁 2&#xff0c;数据的插入与删除 3&#xff0c;其他接口 一&…

力扣:最后一个单词的长度(详解)

前言&#xff1a;内容包括&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组…

基于springboot实现留守儿童爱心网站平台【源码+论文】

基于springboot实现留守儿童爱心网站演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&…

qt 关于QtXlsx的编译 使用

版本&#xff1a;qt 5.14.0 qt creator4.11.0 平时用mingw编译器 QtXlsx源码下载地址&#xff1a;QtXlsxWriter&#xff1a;https://github.com/dbzhang800/QtXlsxWriter 在Qt的XLSX模块提供了一组类来读写Excel文件。它不需要 Microsoft Excel&#xff0c;可以…

EM7电磁铁的技术参数

电磁铁可以通过更换电磁铁极头在一定范围内改善磁场的大小和磁场的均匀度 &#xff0c;并且可以通过调整极头间距改变磁场的大小。主要用于磁滞现象研究、磁化系数测量、霍尔效应研究、磁光实验、磁场退火、核磁共振、电子顺磁共振、生物学研究、磁性测量、磁性材料取向、磁性产…

期货黄金交易平台重要吗?有哪些显著的期货黄金交易平台优势?

黄金交易平台就是可以在其上面做黄金买卖交易的系统&#xff0c;是一种依靠行业应用软件而搭建的平台&#xff0c;里面会包含一些交易指标、趋势图表、K线。市场上的黄金交易平台很多&#xff0c;只有正规的期货黄金交易平台才值得信任。主要还是因为期货黄金交易平台优势所决定…