算法:94. 二叉树的中序遍历--扩展前中后层序遍历

中序遍历 

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

中遍历结果为:H D I B E J A F K C G
 

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100
方法一:递归
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        inorder(root, res);
        return res;
    }

    public void inorder(TreeNode root, List<Integer> res) {
        if (root == null) {
            return;
        }
        inorder(root.left, res);
        res.add(root.val);
        inorder(root.right, res);
    }
}
方法二:迭代
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        Deque<TreeNode> stk = new LinkedList<TreeNode>();
        while (root != null || !stk.isEmpty()) {
            while (root != null) {
                stk.push(root);
                root = root.left;
            }
            root = stk.pop();
            res.add(root.val);
            root = root.right;
        }
        return res;
    }
}

前序遍历  

先序遍历结果为:A B D H I E J C F K G

import java.util.Stack;

// 定义二叉树节点
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    
    TreeNode(int val) {
        this.val = val;
    }
}

public class PreorderTraversal {
    public static void preorderTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        
        while (!stack.isEmpty()) {
            TreeNode current = stack.pop();
            System.out.print(current.val + " ");
            
            // 先将右子树入栈,再将左子树入栈,这样出栈的顺序就是先左后右
            if (current.right != null) {
                stack.push(current.right);
            }
            if (current.left != null) {
                stack.push(current.left);
            }
        }
    }
    
    public static void main(String[] args) {
        // 创建二叉树
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        
        // 非递归前序遍历
        System.out.println("非递归前序遍历结果:");
        preorderTraversal(root);
    }
}

后序遍历 

       
后序遍历结果:H I D J E B K F G C A
在这里插入图片描述

import java.util.Stack;

// 定义二叉树节点
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    
    TreeNode(int val) {
        this.val = val;
    }
}

public class PostorderTraversal {
    public static void postorderTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        
        Stack<TreeNode> stack = new Stack<>();
        Stack<TreeNode> output = new Stack<>(); // 用于保存后序遍历结果
        
        stack.push(root);
        
        while (!stack.isEmpty()) {
            TreeNode current = stack.pop();
            output.push(current);
            
            if (current.left != null) {
                stack.push(current.left);
            }
            if (current.right != null) {
                stack.push(current.right);
            }
        }
        
        // 输出后序遍历结果
        while (!output.isEmpty()) {
            TreeNode node = output.pop();
            System.out.print(node.val + " ");
        }
    }
    
    public static void main(String[] args) {
        // 创建二叉树
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        
        // 非递归后序遍历
        System.out.println("非递归后序遍历结果:");
        postorderTraversal(root);

//非递归后序遍历结果:
//4 5 2 3 1
    }
}

层序遍历   

层次遍历结果:A B C D E F G H I J K

在这里插入图片描述

自己的总结及扩展: 算法:二叉树的层序遍历和每层最大值-CSDN博客

https://blog.csdn.net/modi000/article/details/127301630

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

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

相关文章

汇编语言作业(七)

目录 一、实验目的 二、实验内容 三、实验步骤以及结果 四、实验总结 一、实验目的 熟悉无符号数和有符号数乘法和除法指令的使用掌握无符号位扩展指令的使用掌握逻辑指令的使用 二、实验内容 1、编写一个汇编程序&#xff0c;要求从键盘中输入一个小写字母&#xff0c;将其转…

Python的Pillow(图像处理库)非常详细的学习笔记

Python的Pillow库是一个非常强大的图像处理库。 安装Pillow库&#xff1a; 在终端或命令行中输入以下命令来安装Pillow&#xff1a; pip install pillow 安装后查看是否安装成功以及当前版本 pip show Pillow 升级库&#xff1a; pip install pillow --upgrade 一些基…

【ARM Cache 及 MMU 系列文章 1.4 -- 如何判断 L3 Cache 是否实现?】

文章目录 Cluster Configuration Register代码实现什么是Single-Threaded Core?什么是PE(Processor Execution units)?Single-Threaded Core与PE的关系对比多线程(Multithreading)Cluster Configuration Register 同 L2 Cache 判断方法类似,ARMv9 中也提供了一个自定义…

for 、while循环

练习1&#xff1a;输入一个数&#xff0c;判断是否是完美数 完美数&#xff1a;正序和逆序的结果一致 练习2&#xff1a; * ** *** **** 练习3&#xff1a; **** *** ** * 练习4&#xff1a;输入一个数&#xff0c;计算最大公约数&#xff0c;以及最小公倍数 练习5&#xff…

程序设计实践--3

递推 一只小蜜蜂 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房&#xff0c;不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。其中&#xff0c;蜂房的结构如图所示。 输入描述 输入数据的第一行是一个整数N(1<n<1,000,000),表示测试实例的个数&#xff0c;然…

python-windows10普通笔记本跑bert mrpc数据样例0.1.048

python-windows10普通笔记本跑bert mrpc数据样例0.1.000 背景参考章节获取数据下载bert模型下载bert代码windows10的cpu进行训练进行预测注意事项TODOLIST背景 看了介绍说可以在gpu或者tpu上去微调,当前没环境,所以先在windows10上跑一跑,看是否能顺利进行,目标就是训练的…

Java的自动装箱和自动拆箱

自动装箱和拆箱在Java开发中的应用与注意事项 在Java开发中&#xff0c;自动装箱&#xff08;Autoboxing&#xff09;和自动拆箱&#xff08;Unboxing&#xff09;是指基本数据类型与其对应的包装类之间的自动转换。这些特性可以使代码更加简洁和易读&#xff0c;但在实际项目…

【中颖】SH79F9202 串口通信

头文件 uart.h #ifndef UART_H #define UART_H#include "SH79F9202.h" #include "LCD.h" #include "timer2.h" #include "timer5.h" #include "cpu.h" #include "key.h" #include "io.h" #include &qu…

八股文系列Spark

为什么Spark 比 MapReduce 更快 DAG相比hadoop的mapreduce在大多数情况下可以减少磁盘I/O次数 因为mapreduce计算模型只能包含一个map和一个reduce,所以reduce完后必须进行落盘&#xff0c;而DAG可以连续shuffle的&#xff0c;也就是说一个DAG可以完成好几个mapreduce&#xf…

使用#sortablejs插件对表格中拖拽行排序#Vue3#后端接口数据

使用#sortablejs对表格中拖拽行排序#Vue3#后端接口数据 *效果&#xff1a; 拖动表格行排序 首先安装插件sortable npm install sortablejs --save代码&#xff1a; <template><!-- sortable.js 进行表格排序 --><!-- 演示地址 --><div class"dem…

【全开源】驾校练车管理系统源码(FastAdmin+ThinkPHP)

&#x1f698;驾校练车管理系统&#xff1a;让学车之路更顺畅&#xff01;&#x1f4c8; 一款基于FastAdminThinkPHP开发的驾校管理系统&#xff0c;驾校管理系统(DSS)主要面向驾驶学校实现内部信息化管理&#xff0c;让驾校管理者和工作人员更高效、更快捷的完成枯燥无味的工…

网球运动目标检测跟踪

基于yolo作为目标检测器实现目标检测&#xff0c;使用跟踪器进行跟踪&#xff0c;实现如下功能。 得到视频中的网球运动员&#xff0c;测量他们的速度、击球速度和平均值&#xff0c;方便球友。

我们离成功有多远呢?只要能完成自己阶段性的目标就算是一次成功

做起一个账号&#xff0c;带好一个团队&#xff0c;经营好一家公司&#xff0c;似乎这些都能叫成功&#xff0c;成功的定义可大可小&#xff0c;而我认为只要能完成自己阶段性的目标就算是一次成功&#xff0c;毕竟每个人学历、背景、阅历、资源、认知都不同&#xff0c;很难同…

RV32M指令集

RV32M指令集 1、乘法运算2、除法运算1、乘法运算 MUL 指令(得到整数32位乘积(64位中的低32位)) MUL 指令用于执行两个带符号或无符号整数之间的乘法运算。其语法如下: mul rd, rs1, rs2 它将寄存器 rs1 和 rs2 中的值相乘,并将结果写入寄存器 rd 中。如果 rs1 和 rs2 都是有…

Fiddler抓包工具详细使用教程

各位做测试的同学想必对抓包工具fiddler并不陌生&#xff0c;但是很多同学可能没有总结过它的用法&#xff0c;下面我总结了fiddler一些常用的用法。 Web端抓包配置 打开Fiddler&#xff0c;Tools -> Fiddler Options -> HTTPS 配置完后记得要重启Fiddler 选中Decrpt …

2024年智能制造行业CRM研究(附需求清单、市场格局、选型建议)

在国家大力鼓励智能制造行业与数字化转型这个大背景下&#xff0c;我们选择了2024年智能制造行业数字化的几个关键趋势做深入解读&#xff0c;并对智能制造行业核心的数字化系统CRM进行了全面评估与排名。本文不仅提供了详尽的需求清单&#xff0c;帮助企业明确自身对CRM系统的…

linux笔记8--安装软件

文章目录 1. PMS和软件安装的介绍2. 安装、更新、卸载安装更新ubuntu20.04更新镜像源&#xff1a; 卸载 3. 其他发行版4. 安装第三方软件5. 推荐 1. PMS和软件安装的介绍 PMS(package management system的简称)&#xff1a;包管理系统 作用&#xff1a;方便用户进行软件安装(也…

catia展开模型树

1 直接点号 2 选中零件&#xff0c;右击--命令--将图居中即可 一般都是上面这样有选择性的展开 如果要一次性都展开那

DDei在线设计器-DDeiCore-图形插件

DDei-Core-图形 DDei-Core-图形插件包含了基础绘图形状与基础流程形状两个分组&#xff0c;大约100来个图形&#xff0c;能够满足很基本的框图、架构图、流程图的绘制。 图形以分组的形式组织&#xff0c;一个分组中包含多个图形&#xff0c;一个图形也能够同时存在于多个分组。…

一张试卷

目录 问题 1: 1.时间 题目描述1 输入1 输出1 样例输入1 样例输出1 提示1 代码1 问题 2: 超酷的电话号码 题目描述2 输入2 输出2 样例输入2 样例输出2 提示2 代码2 问题 3:3.爸爸的数学题 题目描述3 输入3 输出3 样例输入3 样例输出3 提示3 代码3 问题 4: 4. 营养膳食 题目描述4…