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

news2024/11/14 21:41:57

本文是力扣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;
    }
}

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

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

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

相关文章

Mendeley Word 文献引用

这里写目录标题 1. 下载Mendeley 并插入到Word1.1 下载安装1.2 在Word 中添加Mendeley 插件文献引用相关 1. 下载Mendeley 并插入到Word 1.1 下载安装 Mendeley 官网下载 1.2 在Word 中添加Mendeley 插件 打开 Mendeley&#xff0c;点击 Tools —>Install Mendeley Cite…

Qt6入门教程 6:Qt元对象系统

目录 一.什么是Qt元对象系统&#xff1f; 二.编译时Qt Creator偷摸做了哪些事情&#xff1f; 1.uic 2.rcc 3.moc 一.什么是Qt元对象系统&#xff1f; Qt中的元对象系统&#xff08;Meta-Object System&#xff09;提供了对象间通信的信号和槽机制、运行时类型信息和动态属…

电池包的UL9540A,电池PACK的UL9540A,工商储的UL9540A,电芯的UL9540A,电池模组的UL9540A,家储的UL9540A

电池包的UL9540A,电池PACK的UL9540A,工商储的UL9540A&#xff0c;电芯的UL9540A&#xff0c;电池模组的UL9540A,家储的UL9540A UL9540A要求ESS在不同条件下进行测试&#xff0c;并要求满足特定的性能要求。测试包括热暴露测试、短路测试、过充电和过放电测试、外部影响测试等。…

从零开发短视频电商 PaddleOCR Java推理 (四)优化OCR工具类

从零开发短视频电商 PaddleOCR Java推理 &#xff08;四&#xff09;优化OCR工具类 参考&#xff1a;https://github.com/mymagicpower/AIAS/blob/9dc3c65d07568087ac71453de9070a416eb4e1d0/1_image_sdks/ocr_v4_sdk/src/main/java/top/aias/ocr/OcrV4RecExample.java import …

统计学之常见的分布介绍

统计学中常见的分布有&#xff1a; 1. 正态分布&#xff08;Normal Distribution&#xff09;&#xff1a;也称为高斯分布&#xff0c;是最常见的分布之一&#xff0c;具有钟形曲线&#xff0c;对称且均值和标准差可以完全描述该分布。 2. 二项分布&#xff08;Binomial Dist…

最新情侣飞行棋源码完全解析+搭建教程:让爱情在游戏中升温!

游戏玩法 摇筛子自动走棋&#xff1a;再也不用手动掷骰子&#xff0c;轻轻一点&#xff0c;棋子自动前进。让游戏更加轻松愉快。任务挑战&#xff1a;每个格子都藏有不同的任务。这些任务既有趣又挑战性&#xff0c;需要你们共同思考、协作完成。当然&#xff0c;你们也可以选…

纯c实现顺序表 数据结构大全

我们已经知道数组是连续的内存地址&#xff0c;顺序表是由数组为基础的一种数据结构&#xff0c;拥有比数组更多的功能&#xff0c;在概念上属于线性结构&#xff0c;跟链表不同的是&#xff0c;顺序表在物理结构上也是线性的 什么是数据结构&#xff1f; 当我们想要使⽤⼤量使…

交友脱单盲盒源码,纸条广场,支持单独抽取/连抽/同城

源码介绍 交友脱单盲盒源码&#xff0c;纸条广场&#xff0c;单独抽取/连抽/同城。 盲 盒交友脱单系统源码包含了学校、爱好、城市、地区、星座等 等信息&#xff0c;具有首页轮转广告和页面美化功能。 首页提供了两款 连抽和高质量底部连抽的选项&#xff0c;并且可以在后台…

❤ React报错问题分析

❤ React报错问题分析 ❤️ You passed a second argument to root.render(…) but it only accepts one argument. You passed a second argument to root.render(…) but it only accepts one argument. react-dom.development.js:86 Warning: You passed a second argumen…

transfomer中Decoder和Encoder的base_layer的源码实现

简介 Encoder和Decoder共同组成transfomer,分别对应图中左右浅绿色框内的部分. Encoder&#xff1a; 目的&#xff1a;将输入的特征图转换为一系列自注意力的输出。 工作原理&#xff1a;首先&#xff0c;通过卷积神经网络&#xff08;CNN&#xff09;提取输入图像的特征。然…

java如何修改windows计算机本地日期和时间?

本文教程&#xff0c;主要介绍&#xff0c;在java中如何修改windows计算机本地日期和时间。 目录 一、程序代码 二、运行结果 一、程序代码 package com;import java.io.IOException;/**** Roc-xb*/ public class ChangeSystemDate {public static void main(String[] args)…

MySQL面试题 | 10.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

WinForms TreeView 控件:保持节点选中状态即使失去焦点

WinForms TreeView 控件&#xff1a;保持节点选中状态即使失去焦点 在 Windows 窗体&#xff08;WinForms&#xff09;应用程序中&#xff0c;TreeView 控件是一种非常有用的界面元素&#xff0c;允许用户以层次结构的方式浏览信息。然而&#xff0c;一个常见的用户界面问题是&…

关于浮点数的四舍五入问题

最近有关注到&#xff0c;在C/C中&#xff0c;对于浮点数的四舍五入&#xff0c;与实际的有一些出入&#xff0c;我打算今天总结一下&#xff0c;并解释一下这是为啥&#xff0c; 好了&#xff0c;下面进入正题&#xff0c;都是干货哦&#xff0c;认真看完&#xff0c;留下你的…

非常好用的Mac清理工具CleanMyMac X 4.14.7 如何取消您对CleanMyMac X的年度订购

CleanMyMac X 4.14.7是Mac平台上的一款非常著名同时非常好用的Mac清理工具。全方位扫描您的Mac系统&#xff0c;让垃圾无处藏身&#xff0c;您只需要轻松单击2次鼠标左键即可清理数G的垃圾&#xff0c;就这么简单。瞬间提升您Mac速度。 CleanMyMac X 4.14.7下载地址&#xff1a…

Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程

&#xff08;转载&#xff09;原文链接&#xff1a;https://blog.csdn.net/u014044624/article/details/123303174 本篇是mii management/mdio模块分析的第三篇文章&#xff0c;本章我们主要介绍mii-bus的注册与注销接口。在前面的介绍中也已经说过&#xff0c;我们可以将mii-b…

如何增加服务器的高并发

随着互联网的快速发展和普及&#xff0c;越来越多的应用程序需要支持高并发的请求处理。在这种情况下增加服务器的高并发能力成为了一个热门的话题。下面简单的介绍如果提高服务器的高并发能力。 负载均衡 是把请求分发到多个服务器上&#xff0c;来实现请求的平衡和分担。负…

compose 实验

cd /opt mkdir compose_nginx cd compose_nginx mkdir nginx cd nginx/ 此时顺便将nginx安装包拖进来 vim Dockerfile mkdir /opt/compose_nginx/wwwroot echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html docker netw…

如何配置mybatisplus基础环境?

1.在pom文件&#xff08;都加上吧&#xff0c;以防万一&#xff09; 2.若当初有mybatis的依赖&#xff0c;要删除 3.在Mapper接口加上"extends BaseMapper<实体类型>" 4.更改yml文件内容 别名扫描包&#xff1a;是指实体类型 5.添加"extends ServiceIm…

SQL语句详解四-DQL(数据查询语言-约束)

约束 概述&#xff1a;对表中的数据进行限定&#xff0c;保证数据的正确性&#xff0c;有效性和完整性。 约束分类 约束关键字约束意思primary key主键约束not null非空约束unique唯一约束foreign key外键约束 例子&#xff1a;sname varchar(40) not null, – 代表 sname 这…