每日一练:LeeCode-144、145、94.二叉树的前中后序遍历【二叉树】

本文是力扣LeeCode-144、145、94.二叉树的前中后序遍历 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode前序遍历、中序遍历、后序遍历。

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

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

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

题目以前序遍历为例
示例 1:

在这里插入图片描述

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

示例 2:

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

示例 3:

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

示例 4:
在这里插入图片描述

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

示例 5:
在这里插入图片描述

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

提示:

树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100

思路

递归法、迭代遍历法

1、递归法

1)确定递归函数的参数和返回值
2)确定终⽌条件
3)确定单层递归的逻辑

代码实现

前序遍历(中左右)

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

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

中序遍历(左中右)

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

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

后序遍历(左右中):

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

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

2、迭代遍历法

递归其实也是使用栈这种数据结构,只是不是显式地调用,迭代遍历法,就是用到实现
前序遍历(中左右)
由于的特性,我们需要先将根节点入栈,遍历完后,然后将右孩子入栈,再将左孩子入栈,因为这样才能保证遍历顺序是中左右

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> res = new ArrayList<>();
        if(root == null)return res;
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();	// 中
            res.add(node.val);
            if(node.right!=null)stack.push(node.right);	// 右(空节点不⼊栈)
            if(node.left!=null)stack.push(node.left);	// 左(空节点不⼊栈)
        }
        return res;
    }
}

前序遍历迭代遍历后,可以轻易带出后序遍历
后序遍历(左右中)
后序遍历的遍历顺序为:左右中前序遍历中左右,可以先将根节点入栈,遍历完后,然后将右左孩子入栈,再将右孩子入栈,最后将结果反转数组即可。

代码实现

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> res = new ArrayList<>();
        if(root == null)return res;
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            res.add(node.val);
            if(node.left!=null)stack.push(node.left);	//先将左孩子入栈
            if(node.right!=null)stack.push(node.right);	//再将右孩子入栈,以保证反转后的顺序
        }
        Collections.reverse(res);	//结果反转
        return res;
    }
}

中序遍历(左中右)

由于中序遍历遍历访问顺序(从根节点到叶子结点,从上往下)左中右处理顺序不一样前序和后序是一致的,所以,我们需要先使用指针,从最左边的叶子结点开始处理利用栈的出栈顺序,一个一个往根节点上走然后处理到根节点后,再处理根节点的右孩子

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new  Stack<>();
        List<Integer> res = new ArrayList<>();
        TreeNode cur = root;
        while(cur!=null || !stack.isEmpty()){
            if(cur!=null){	 // 指针来访问节点,访问到最底层
                stack.push(cur);	// 将访问的节点放进栈
                cur = cur.left;		// 左
            }else{
                cur = stack.pop();	 // 从栈⾥弹出的数据,就是要处理的数据(放进result数组⾥的数据)
                res.add(cur.val);	// 中
                cur = cur.right;	// 右
            }
        }
        return res;
    }
}

最重要的一句话:做二叉树的题目,首先需要确认的是遍历顺序
大佬们有更好的方法,请不吝赐教,谢谢

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

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

相关文章

RK3399平台入门到精通系列讲解(外设篇)热成像传感器MLX90640 JNI控制程序

文章目录 JNI回调函数回调函数的实现驱动可以详看:链接 JNI 文件:native-lib.cpp

编译 FastDFS 时报错 fatal error: sf/sf_global.h: No such file or directory 解决办法

编译 FastDFS 时&#xff0c;报错如下 gcc -Wall -D_FILE_OFFSET_BITS64 -D_GNU_SOURCE -g -O1 -DDEBUG_FLAG -c -o ../common/fdfs_global.o ../common/fdfs_global.c -I../common -I/usr/local/include In file included from ../common/fdfs_global.c:21:0: ../common/fdf…

Ps:认识路径

在 Photoshop 中&#xff0c;路径 Path广泛地应用于创建精确的图像边界&#xff08;包括精准抠图&#xff09;以及复杂的图形设计之中。 路径又称为“矢量路径”&#xff0c;或者“贝塞尔曲线” Bezier Curves路径。 路径本身只是一种基于数学方程的“轮廓指示”&#xff0c;并…

曲面上偏移命令的查找

今天学习老王的SW绘图时&#xff0c;遇到一个命令找不到&#xff0c;查询了一会终于找到了这个命令&#xff0c;防止自己忘记&#xff0c;特此记录一下&#xff0c;这个命令就是“曲面上偏移”&#xff0c;网上好多的教程都是错误的&#xff0c;实际上这个命令没有在曲面里面&a…

绝地求生追封原理

绝地求生追封原理是指在网络游戏《绝地求生》中&#xff0c;玩家通过观察和分析游戏中的各种信息&#xff0c;追踪其他玩家的位置和行动&#xff0c;以便更好地进行战术和攻击。 追封原理主要通过以下几种方式实现&#xff1a; BattleEye作弊系统检测 绝地求生玩家对这个系统…

MHFormer 论文解读

目录​​​​​​​ Multi-Hypothesis Transformer 结果 Introduction & Related work 多假设 为什么作者提出这个模型&#xff1f; 3.Multi-Hypothesis Transformer 3.1 Preliminary 3.2 MultiHypothesis Generation 3.3 Temporal Embedding 3.4. SelfHypothesi…

Kubernetes (K8S) 3 小时快速上手 + 实践

1. Kubernetes 简介 k8s即Kubernetes。其为google开发来被用于容器管理的开源应用程序&#xff0c;可帮助创建和管理应用程序的容器化。用一个的例子来描述&#xff1a;"当虚拟化容器Docker有太多要管理的时候&#xff0c;手动管理就会很麻烦&#xff0c;于是我们便可以通…

网络安全的威胁PPT

建议的PPT免费模板网站&#xff1a;http://www.51pptmoban.com/ppt/ 此PPT模板下载地址&#xff1a;https://file.51pptmoban.com/d/file/2023/03/20/1ae84aa8a9b666d2103f19be20249b38.zip 内容截图&#xff1a;

2.3 数据链路层03

2.3 数据链路层03 2.3.7 以太网交换机 1、以太网交换机的基本功能 以太网交换机是基于以太网传输数据的交换机&#xff0c;以太网交换机通常都有多个接口&#xff0c;每个接口都可以直接与一台主机或另一个以太网交换机相连&#xff0c;一般都工作在全双工方式。 以太网交换…

个性化定制的知识付费小程序,为用户提供个性化的知识服务

明理信息科技知识付费saas租户平台 随着知识经济的兴起&#xff0c;越来越多的人开始重视知识付费&#xff0c;并希望通过打造自己的知识付费平台来实现自己的知识变现。本文将介绍如何打造自己的知识付费平台&#xff0c;并从定位、内容制作、渠道推广、运营维护四个方面进行…

C语言自学之运算符3

1、算术运算符 加减乘除 2、取模运算 3、递增递减运算符 4、赋值运算符 5、比较运算符 6、逻辑非运算符 7、逻辑与运算符 8、逻辑或运算符 9、运算符优先级

Ansible Filter滤波器的使用(二)

一、【说在前面】 Ansible Filter一般被称为滤波器或者叫过滤器。 这个东西初次听到以为是什么科学计算的东西&#xff0c;但是想来ansible不太可能有什么滤波操作&#xff0c;所以这个东西本质是一个数值筛选器&#xff0c;内置函数&#xff0c;本质是一个为了做区别化的工具…

JVM内存模型/运行时数据区域

java虚拟机管理这块内存&#xff0c;所以我们也叫运行时数据区域 总览 这里按线程是否共享来分类&#xff0c;所谓线程不共享就是每个线程里面都会配一套 程序计数器 栈&#xff0c; 互相不干涉。 而方法区和堆是线程所有共享 意味着只有一个&#xff08;这里注意堆是实际概念…

自动化的自动化(1)--OPCUA2HTML5

现在的自动化工程师是令人沮丧的&#xff0c;他们努力地实现各个行业的自动化系统&#xff0c;自己却停留在敲键盘的手工劳作的阶段&#xff0c;该解放自己了。这就是“自动化实现自动化”的话题。 OPC 统一架构&#xff08;简称 OPC UA&#xff09;是现代工厂自动化中用于机器…

Jenkins之pipeline

安装插件 Pipeline Pipeline: Stage View Plugin 创建任务 配置 demo 开始实践 拉取git仓库代码 checkout scmGit(branches: [[name: */main]], extensions: [], userRemoteConfigs: [[url: http://178.119.30.133:8929/root/mytest.git]])通过SonarQube做质量检测 sh …

在 Linux 本地部署 stable diffusion

由于工作站安装的是 ubuntu&#xff0c;卡也在上面&#xff0c;就只能在 ubuntu 上部署安装 stable diffusion 了。另外&#xff0c;Linux 上使用 stable diffusion 也会方便很多。 1 准备工作 NVIDIA 官网下载驱动&#xff0c;主要是为了规避多卡驱动不同的问题。由于本机是…

C语言中的浮点数存储

首先明确一个概念&#xff1a;C语言中整形是按照二进制存储在内存中&#xff0c;浮点型是按科学计数法存储在内存中&#xff08;本质上存储的还是二进制数据0和1&#xff09;。 如果没看懂这句话&#xff0c;没关系&#xff01;看完以下正文&#xff0c;你就会豁然开朗&#x…

Codeforces Round 114 (Div. 1) C. Wizards and Numbers(思维题 辗转相除+博弈 巴什博弈)

题目 t(t<1e4)组询问&#xff0c;每次询问(a,b)&#xff08;0<a,b<1e18&#xff09;&#xff0c; 不妨a<b&#xff08;a>b时需要交换两个数考虑&#xff09; ①令b减去a的k次方&#xff08;k>1&#xff09;&#xff0c;要求减完之后b非负 ②令bb%a 当a和…

MATLAB - 使用 TOPP-RA 求解器生成带约束条件的时间最优轨迹

系列文章目录 前言 本例演示如何生成满足速度和加速度限制的轨迹。该示例使用了 contopptraj 函数&#xff0c;该函数使用可达性分析 (RA) 求解受约束的时间最优路径参数化 (TOPP) 轨迹。 一、示例背景 本例解决的是 TOPP 问题&#xff0c;这是一个机器人问题&#xff0c;其目…

Vue知识总结-下

VUE-组件间通信 组件的自定义事件 概述&#xff1a;是一种组件间通信的方式,适用于&#xff1a;子组件>父组件使用场景&#xff1a;A是父组件,B是子组件,B给A传递数据,那么需要在A组件中绑定自定义事件(事件的回调也在A中)使用步骤 绑定自定义事件&#xff1a; 第一种方式…