算法通关村—迭代实现二叉树的前序,中序,后序遍历

news2024/12/23 14:11:24

1. 前序中序后序递归写法

前序

public void preorder(TreeNode root, List<Integer> res) {
        if (root == null) {
            return;
        }
        res.add(root.val);
        preorder(root.left, res);
        preorder(root.right, res);
    }

后序

public static void postOrderRecur(TreeNode head) {
    if (head == null) {
        return;
    }
    postOrderRecur(head.left);
    postOrderRecur(head.right);
    System.out.print(head.value + " ");
}

中序

public static void inOrderRecur(TreeNode head) {
    if (head == null) {
        return;
    }
    inOrderRecur(head.left);
    System.out.print(head.value + " ");
    inOrderRecur(head.right);
}

2. 前序遍历迭代法

前序遍历的主要特征是中左右
在这里插入图片描述
上面的前序遍历是:1 2 4 5 3 6 7
很明显 1 2 4都是左子树,然后遍历完了才到右子树,那么迭代需要做的就是一直遍历左子树节点,然后保存当前的左子树的根节点,左子树完了,然后去除节点找到右节点。这里面需要使用栈来进行存储节点,然后按照相应的顺序弹出节点。

2.1 二叉树的前序遍历

二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
输入:root = [1,null,2,3]
输出:[1,2,3]
在这里插入图片描述

 public List<Integer> preorderTraversal(TreeNode root) {
      List<Integer> res = new ArrayList<>();
      if(root == null)  return res;
      Deque<TreeNode> stack = new LinkedList<>();
      TreeNode node = root;
      while(!stack.isEmpty() || node!=null){
          while(node!=null){
              res.add(node.val);
              // 保存根节点,找到对应的右节点
              stack.push(node);
              // 处理左子树
              node = node.left;
          }
          // 找到对应的右节点的根节点
        node = stack.pop();
        // 处理右子树
        node=node.right;
      }
      return res;
    }

3. 迭代法中序遍历

特点:左中右
在这里插入图片描述
元素:4 2 5 1 6 3 7
这个可以看作每次先遍历最左的子树节点,然后输出最下面的节点,逆序,如果根节点还有右节点,就继续进入右节点到最下面,否则依然逆序输出。依然需要使用一个栈来存储这个节点。

3.1 二叉树的中序遍历

二叉树的中序遍历
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

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

总体上一致,只不过添加的时候是添加的当前链路最后一个节点元素。

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root ==null) return res;
        Deque<TreeNode> stack = new LinkedList<>();
        TreeNode node = root;
        while(!stack.isEmpty() || node!=null){
            while(node!=null){
                stack.push(node);
                node=node.left;
            }
            // 此时已经到头了
            node = stack.pop();
            res.add(node.val);
            node=node.right;
        }
        return res;
    }

4. 后序遍历

特点:左右中
在这里插入图片描述
元素:4 5 2 6 7 3 1
元素特点:需要输出当前根节点的两个子节点的值,然后再输出根节点。但是实际操作下来发现很麻烦,将后序便利的元素反转变成 1 3 7 6 2 5 4, 而这样就和前序类似,只不过区别在于前序先遍历左节点,现在需要遍历右节点,然后将列表元素整体反转。

4.1 二叉树的后序遍历

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

 public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        Deque<TreeNode> stack = new LinkedList<>();
        TreeNode node = root;
        while(!stack.isEmpty() || node!=null){
            while(node!=null ){
                res.add(node.val);
                stack.push(node);
                node= node.right;
            }
            node =  stack.pop();
            node = node.left;
        }
        Collections.reverse(res);
        return res;
    }

但是这个方法并没有用到相关的后序遍历的特性,只是使用的前序

4.2 迭代法

public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        Deque<TreeNode> stack = new LinkedList<>();
        TreeNode node = null;
        while(!stack.isEmpty() || root!=null){
            while(root!=null ){
                stack.push(root);
                root= root.left;
            }
            root =  stack.pop();
            // 如果右子树为空或者已经被访问过了,才能添加当前节点值
            if(root.right==null || root.right == node){
                res.add(root.val);
                node=root;
                root=null;
            }else{
                stack.push(root);
                root = root.right;
            }
        }
        return res;
    }

这个方法有一点难以理解,但是也能看得懂相关步骤。

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

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

相关文章

基于Web智慧森林防火GIS监测预警可视化系统

森林火灾是森林最危险的敌人&#xff0c;也是林业最可怕的灾害&#xff0c;它会给森林带来毁灭性的后果。 建设背景 森林火灾&#xff0c;重在预防。随着现代技术的快速发展&#xff0c;数字化森林监控已成为及早发觉&#xff0c;排除森林火灾隐情的必要手段。充分利用现代科…

C++ 指针数组

如果一个数组的每个元素都是指针变量&#xff0c;这个数组就是指针数组。指针数组的每个元素都必须是同一类型的指针。 1.一维指针数组 声明一维指针数组的语法形式&#xff1a; 数据类型*数组名[下标表达式];下标表达式指出数组元素的个数&#xff0c;数据类型确定每个元素…

【雕爷学编程】MicroPython动手做(29)——物联网之SIoT

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

浙大数据结构第六周之06-图3 六度空间

题目详情&#xff1a; “六度空间”理论又称作“六度分隔&#xff08;Six Degrees of Separation&#xff09;”理论。这个理论可以通俗地阐述为&#xff1a;“你和任何一个陌生人之间所间隔的人不会超过六个&#xff0c;也就是说&#xff0c;最多通过五个人你就能够认识任何一…

动手学深度学习—卷积神经网络(原理解释+代码详解)

目录 1. 从全连接层到卷积层2. 图像卷积2.1 互相关运算2.2 卷积层2.3 图像中目标的边缘检测2.4 学习卷积核2.5 特征映射和感受野 3. 填充和步幅3.1 填充3.2 步幅 4. 多输入多输出通道4.1 多输入通道4.2 多输出通道4.3 11卷积核 5. 汇聚层5.1 最大汇聚层和平均汇聚层5.2 填充和步…

Stable Diffusion - SDXL 模型测试 (DreamShaper 和 GuoFeng v4) 与全身图像参数配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132085757 图像来源于 GuoFeng v4 XL 模型&#xff0c;艺术风格是赛博朋克、漫画、奇幻。 全身图像是指拍摄对象的整个身体都在画面中的照片&…

Bean的实例化方法

目录 1.工厂模式通常有三种形态&#xff1a; 2.简单工厂 2.1 静态工厂 2.1通过factory-bean实例化 2.3通过FactoryBean接口实例化 3.测试 关于容器的使用 3.1获得spring文件方式 3.2getBean方式 4.关闭容器 1.工厂模式通常有三种&#xff1a; 第一种&#xff1a;简单工…

二叉树题目:叶子相似的树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;叶子相似的树 出处&#xff1a;872. 叶子相似的树 难度 3 级 题目描述 要求 考虑一个二叉树上所有的叶子&…

消息队列项目(1)

概念 这里的消息队列, 大致上就是一个生产者消费者模型. 我这个消息队列是仿照 RabbitMQ 的实现原理来进行编写的 需求分析 有几个核心的概念: 生产者(Producer)消费者(Consumer)中间人(Broker)发布(Publish) :生产者向中间人投递消息的过程订阅(Subcribe) :记录哪些消费者…

Java面试题 如何提高自己的算法?

练习一&#xff1a;飞机票 需求:机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来年4月&a…

【Java可执行命令】(十五)Java进程状态信息获取工具 jps:获取和监控Java进程的状态信息 ~

Java可执行命令之jps 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 可选参数&#xff1a;-q3.3 可选参数&#xff1a;-m3.4 可选参数&#xff1a;-l3.5 可选参数&#xff1a;-v3.6 可选参数&#xff1a;-V 4️⃣ 应用场景&#x1f33e; 总结 1️⃣ 概念 JPS&#xff…

【BEV感知】1-BEV感知算法介绍

1-BEV感知算法介绍 1 什么是BEV感知算法&#xff1f;1.1 什么是BEV&#xff1f;1.2 什么是感知&#xff1f;1.3 什么是算法&#xff1f;1.4 什么是BEV感知&#xff1f; 1 什么是BEV感知算法&#xff1f; 1.1 什么是BEV&#xff1f; Bird’s-Eye-View&#xff0c;尺度变化小、…

客户端电脑使用 FTP的Cadence_CIS库方法说明 (下)

简介&#xff1a;随着企业的规模扩大&#xff0c;硬件工程师的增多&#xff0c;使用统一服务器上的库管理&#xff0c;可以减少设计错误&#xff0c;提高效率。 使用在FTP上布局Cadence_CIS库&#xff0c;是目前的主流的做法之一&#xff1b; 本文方法&#xff0c;用于已经配置…

【网络基础进阶之路】一文弄懂TCP的三次握手与四次断开

系列文章&#xff1a; 【网络基础进阶之路】路由器间的静态综合详解 文章目录&#xff1a; 一、TCP协议 二、三次握手——建立连接 三、四次断开——结束连接 一、TCP协议 TCP是一种面向广域网的通信协议&#xff0c;目的是在跨越多个网络通信时&#xff0c;为两个通信端…

如何利用闭环思维解决企业营销问题

彼得圣吉在他的畅销书《第五项修炼》一书中主要介绍了“系统思考”的第五项修炼&#xff0c;系统思考的方法有三个基本元件&#xff1a;不断增强的回馈&#xff0c;反复调节的回馈&#xff0c;和时间滞延。其不断增强的回馈其实就是增强闭环理论&#xff0c;其在企业管理中有很…

嘿嘿嘿~卷王来喽~今天我被卷s了,谁也白想活zhuo!

前言 嘿嘿嘿~热乎乎的卷王来喽&#xff0c;卷呀&#xff01;你们怎么不卷&#xff01;&#xff08;啪&#xff01;电脑一合&#xff09;&#xff0c;好&#xff01;今天&#xff0c;我卷了&#xff0c;我得卷s&#xff0c;但是&#xff01;我被卷了&#xff0c;你们也白想活着…

极狐GitLab 10 年开源研发管理实践:4 个核心步骤突破效能瓶颈

目录 研发效能实践的痛点 4 步击破痛点&#xff0c;提升研发效能 1. 明确目标 2. 优化研发流程 ➤ 2.1 文档先行 ➤ 2.2 可追踪的任务 ➤ 2.3 自动化工作流 3. 注重代码质量 ➤ 3.1 代码门禁&#xff1a;严格要求&#xff0c;提前报错 ➤ 3.2 合并请求&#xff1a;代…

Netty 入门指南

文章目录 前言Netty介绍Netty发展历程Netty核心组件实现HTTP服务器总结 前言 上文《BIO、NIO、IO多路复用模型详细介绍&Java NIO 网络编程》介绍了几种IO模型以及Java NIO&#xff0c;了解了在网络编程时使用哪种模型可以提高系统性能及效率。即使Java NIO可以帮助开发人员…

【java】【maven】【高级】MAVEN聚合继承属性等

目录 1、模块开发与设计 2、聚合 2、继承 3、属性 4、版本管理 5、资源配置 6、多环境配置 7、多环境开发配置 8、跳过测试 9、私服 前言&#xff1a;maven的高级使用包含分模块开发与设计、聚合、继承、属性、版本管理、资源配置、多环境配置、多环境开发配置、跳过…

软件测试缺陷报告

缺陷报告是描述软件缺陷现象和重现步骤地集合。软件缺陷报告Software Bug Report&#xff08;SBR&#xff09;或软件问题报告Software Problem Report&#xff08;SPR&#xff09; 作用&#xff1a;缺陷报告是软件测试人员的工作成果之一&#xff0c;体现软件测试的价值缺陷报…