day11|144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历

news2025/1/17 0:58:10

144.二叉树的前序遍历

        给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

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

输出:[1,2,3]

示例 2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]

示例 4:

输入:root = [1,2] 
 

输出:[1,2]


问题分析:

①递归法:

1、确定递归函数的参数和返回值

2、确定终止条件

3、确定单层递归的逻辑

②迭代法:

把节点先压入栈中,再从栈中弹出放入数组。 注意压入栈中顺序:前右左,这样才能在弹出元素时变成前左右

方法一:递归法

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result=new ArrayList<>();
        preOrder(root,result);
        return result;

    }
    public void preOrder(TreeNode root,List<Integer> result){//确定递归函数的参数和返回值
        if (root==null){//确定终止条件
            return;
        }
        //确定单层递归的逻辑
        result.add(root.val);
        preOrder(root.left,result);
        preOrder(root.right,result);

    }
}

方法二:迭代法 

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result=new ArrayList<>();//数组
        Stack<TreeNode> st=new Stack<>();//栈
       if (root==null){
           return result;
        }
       st.push(root);
       while(!st.isEmpty()){
           TreeNode node=st.pop();
           result.add(node.val);
           if(node.right!=null){
               st.push(node.right);
           }
           if(node.left!=null){
               st.push(node.left);
           }

       }
       return result;
    }

}

 145.二叉树的后序遍历 

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

示例 1:

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

输出:[3,2,1]

示例 2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]

问题分析:

递归法

迭代法:如果指针不为空,先处理左节点,让其弹入到栈中,如果有左孩子就继续弹入,指针左移。 如果指针为空,指针返回栈顶节点,并弹出栈顶节点,指针再移到此节点的右孩子,再继续判断是否为空。

 

方法一:递归法

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result=new ArrayList<>();
        postOrder(root,result);
        return result;
    }
    public void postOrder(TreeNode root,List<Integer> result){
        if(root==null){
            return;
        }
        postOrder(root.left,result);
        postOrder(root.right,result);
        result.add(root.val);
    }
}

方法二:迭代法

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result=new ArrayList<>();
        Stack<TreeNode> st =new Stack<>();
        if (root==null) return result;

        TreeNode cur=root;
        while(cur!=null||!st.isEmpty()){
            if(cur!=null){
                st.push(cur);
                cur=cur.left;
            }
            else{//如果遍历到空节点,就把cur指向栈顶元素
                cur=st.pop();
                result.add(cur.val);
                cur=cur.right;
            }
        }
        return result;
    }

}

 94.二叉树的中序遍历

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

示例 1:

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

输出:[1,3,2]

示例 2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]

 问题分析:

递归法

迭代法

 利用前序遍历类似思路 入栈:中左右->出栈:中右左->翻转数组:左右中

方法一:递归法

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result=new ArrayList<>();
        inOrder(root,result);
        return result;
    }
    public void inOrder(TreeNode root,List<Integer> result){
        if(root==null){
            return;
        }
        inOrder(root.left,result);
        result.add(root.val);
        inOrder(root.right,result);
    }
}

方法二:迭代法

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result=new ArrayList<>();
        Stack<TreeNode> st=new Stack<>();//栈存树节点
        if (root==null) return result;
        st.push(root);//先把root加入栈中
        while(!st.isEmpty()){
            TreeNode node=st.pop();
            result.add(node.val);
            if(node.left!=null){
                st.push(node.left);
            }
            if(node.right!=null){
                st.push(node.right);
            }
        }
    Collections.reverse(result);//static void reverse(List<?> list)反转指定列表中元素的顺序。

        return result;
    }

}

 

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

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

相关文章

隔离放大器工作原理及其应用

介绍 隔离放大器或单位增益放大器提供从电路的一部分到另一部分的隔离。因此&#xff0c;不能在电路中消耗、使用和浪费功率。该放大器的主要功能是增加信号。运算放大器的相同输入信号作为输出信号从运算放大器精确地传出。这些放大器用于提供电气安全屏障和隔离。这些放大器…

从制造到“智造”,中国电信5G创新赋能工厂进入全连接时代

日前&#xff0c;工业和信息化部印发《5G全连接工厂建设指南》&#xff0c;提出“十四五”时期&#xff0c;主要面向原材料、装备、消费品、电子等制造业各行业以及采矿、港口、电力等重点行业领域&#xff0c;推动万家企业开展5G全连接工厂建设&#xff0c;建成1000个分类分级…

十一.字符串函数与内存函数

目录 一.求字符串长度 二.长度不受限制的字符串函数 1.strcpy函数 2.strcat函数 3.strcmp函数 三.长度受限制的字符串函数 1.strncpy函数 2.strncat函数 3.strncmp函数 四.字符串查找 1.strstr函数 2.strtok函数 3.strerror函数 五.字符操作 1.字符分类 2.字符…

【SpringCloud04】订单-支付微服务模块(消费者订单模块)

1.建cloud-consumer-order80 2.改pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

黑客在 GitHub 上的劫持活动中使用验证码绕过策略

作为名为 PURPLEURCHIN 的免费劫持活动的一部分&#xff0c;已观察到一个名为 Automated Libra 的南非威胁行为者使用验证码旁路技术以编程方式创建 GitHub 帐户。 Palo Alto Networks Unit 42 研究人员 William Gamazo 和 Nathaniel Quist 表示&#xff0c;该组织“主要针对提…

【UE4 第一人称射击游戏】36-切换武器时改变UI

上一篇&#xff1a;UE4 第一人称射击游戏】35-击中目标时添加准心提示本篇效果&#xff1a;步骤&#xff1a;打开项目设置&#xff0c;添加两个操作映射两个操作映射分别命名为“SelectPrimary”和“SelectSecondary”&#xff0c;通过键盘1和2控制&#xff0c;分别表示玩家当前…

【MySQL】-【索引的创建与设计原则】

目录索引的声明与使用索引的分类创建索引创建表的时候创建索引在已经存在的表上创建索引索引的声明与使用 索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。&#xff08;没有空间索引是因为有的存储引擎不支持空间索引&#xff…

波士顿房价预测——机器学习入门级案例

一、数据处理 1.1 数据集介绍 本实验使用波士顿房价预测数据集&#xff0c;共506条样本数据&#xff0c;每条样本包含了12种可能影响房价的因素和该类房屋价格的中位数&#xff0c;各字段含义如下表所示&#xff1a; 字段名类型含义CRIMfloat该镇的人均犯罪率ZNfloat占地面积…

springboot中迁移接口报404错误找不到 main方法java.lang.UnsupportedClassVersionError的经历

一、出现问题公司有接口要迁移到新服务中&#xff0c;服务不能启动错误大概如下&#xff1a;错误: 在类 ### 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application问题1解决后&am…

字符串函数和内存函数

在c语言中&#xff0c;有非常多的库函数&#xff0c;比如我们经常使用的scanf和printf&#xff0c;除此之外&#xff0c;还有一些非常实用的函数&#xff0c;比如我们之前使用的qsort排序函数&#xff0c;可以对任意数据类型进行排序&#xff0c;strlen函数&#xff0c;可以计算…

1.5万字总结 Redis 常见面试题知识点

以下内容来源于于我开源的 JavaGuide (Java学习&&面试指南,Github 130k star,370人共同参与爱完善), 万字总结,质量有保障! Redis 基础 什么是 Redis? Redis 是一个基于 C 语言开发的开源数据库(BSD 许可),与传统数据库不同的是 Redis 的数据是存在内存中的…

磨金石教育插画技能干货分享|学习插画可以从事什么工作?

近几年插画师这个行业越来越热&#xff0c;许多有一定绘画基础的朋友&#xff0c;都在跃跃欲试&#xff0c;想要走进插画这个行业。但不少人都有一种担忧&#xff0c;就是插画师这个职位平时听的很少&#xff0c;认为这是个冷门行业&#xff0c;是不是难以就业&#xff0c;风险…

边双连通分量

如果还未学习强连通分量&#xff0c;建议先学习强连通分量的tarjan算法强连通分量&#xff08;tarjan算法&#xff09; 1&#xff0c;定义 相对于在单向图的强连通分量&#xff0c;双连通分量是在无向图中&#xff0c;无向图有一个特点&#xff0c;可以以任何一个点为根节点建…

Java开发常见漏洞及解决方案

文章目录1.健康监控Actuator暴露端口2.SSRF漏洞攻击3.富文本XSS攻击4.暴力破解短信验证码登录5.恶意短信轰炸骚扰用户6.低版本Fastjson导致RCE漏洞7.SQL注入漏洞8.水平越权信息泄露9.权限绕过漏洞1.健康监控Actuator暴露端口 ​ Actuator是Springboot提供的用来对应用系统进行…

html 判断视频是否播放

html 判断视频是否播放 html <video id"video" loop preload"auto" autoplay><source src"1.mp4" type"video/mp4">您的浏览器不支持Video标签。 </video> js代码 var videodocument.querySelector("#vide…

phpstudy如何安装PHP扩展sg11

1、下载sg11扩展文件压缩包&#xff0c;下载地址&#xff1a;PHP扩展sg11.zip - 蓝奏云 2、解压下载好的sg11压缩包&#xff0c;选择对应你自己的服务器系统文件夹&#xff0c;我的是Windows 64-bit 3、打开Windows 64-bit&#xff0c;复制对应PHP版本的.win文件&#xff0c;…

电脑一键重装系统win11步骤教程

win11系统是微软目前最新的操作系统&#xff0c;很多人都想给电脑重装系统win11体验。那么具体要怎么重装系统win11呢?我们可借助一键装机工具实现&#xff0c;下面就演示下简单的一键重装系统win11步骤教程 工具/原料&#xff1a; 系统版本&#xff1a;Windows 11 品牌型号…

基于轻量级ShuffleNetv2+YOLOv5的DIC-C2DH-HeLa细胞检测识别分析系统

ShuffleNetv2可以说是目前轻量级网络模型中的翘楚&#xff0c;将ShuffleNetv2于yolov5整合开发可以使得模型更加轻量化&#xff0c;在提升模型速度的同时保证有效的精度。本文的主要工作就是将ShuffleNetv2整合进yolov5中来开发构建细胞检测模型&#xff0c;首先看下效果图&…

4-3文件管理-磁盘组织与管理

文章目录一.磁盘的结构二.磁盘调度算法&#xff08;一&#xff09;一次读/写磁盘需要的时间&#xff08;二&#xff09;磁盘调度算法1.先来先服务FCFS2.最短寻找时间优先SSTF3.扫描算法/电梯调度算法SCAN4.循环扫描算法C-SCAN&#xff08;三&#xff09;减少磁盘延迟时间的方法…

再谈模板(19)

目录 1、非类型模板参数 2、模板的特化 1、定义 2、函数模板特化 3、类模板特化 1、全特化 2、偏特化 3、分离编译 1、什么是分离编译 2、模板不支持分离编译 4、模板总结 1、非类型模板参数 模板参数&#xff1a;类型形参与非类型形参。 类型形参&#xff1a;出现…