算法1—递归实现二叉树的前序、中序、后序遍历

article/2025/9/17 16:51:34

为什么会有这三种遍历?

仅个人理解,计算机特点就是处理速度级快,为了不遗漏、不重复处理二叉树的每一个节点,总得按照某种顺序吧,前辈们发明了处理二叉树节点的顺序:前序遍历、中序遍历、后续遍历,经过时间的检验还是可以的。

二叉树的前序、中序、后序遍历的作用都是不遗漏且不重复地处理二叉树的每一个结点

理解前序、中序、后序遍历

前序

前序就是和构建二叉树一个顺序,先根节点、后左节点、最后右节点,如下图示:得到的遍历结果为:ABCDEF
在这里插入图片描述

中序

中序遍历:先左节点、然后根节点、最后右节点,如下图示:得到的遍历结果为:CBDAEF
在这里插入图片描述

后序

后序遍历:先左节点、然后右节点、最后跟节点,如下图示:得到的遍历结果为:CDBFEA
在这里插入图片描述

应用场景

前序对应快排、回溯、深搜等等算法,中序对应对应汉诺塔、BST的判定等等算法,后序对应归并、堆排序、记忆搜索等等算法,各种算法模板之间是有联系的

代码实现

1、先构建一颗如下图所示的二叉树

在这里插入图片描述
2、构建代码如下所示:

定义一个 TrNode 用于封装左右指针、和 value 值

class TrNode {public TrNode left;public TrNode right;public String value;public TrNode(TrNode left, TrNode right, String value) {this.left = left;this.right = right;this.value = value;}
}

然后直接用最简单最暴力的方式构建二叉树,如下所示:

    private static TrNode buildBtree() {TrNode node_C = new TrNode(null,null,"C");TrNode node_D = new TrNode(null,null,"D");TrNode node_B = new TrNode(node_C,node_D,"B");TrNode node_F = new TrNode(null,null,"F");TrNode node_E = new TrNode(null,node_F,"E");TrNode rootNode = new TrNode(node_B,node_E,"A");return rootNode;}

3、开始前序遍历二叉树代码演示:

基本思路——递归思想

  • 退出条件:遍历到当前节点为 null 的时候退出这次递归调用
  • 入参和返回值:入参从 root 开始,然后到他的左子右子树,返回值这里不需要,还有可以定义一个入参用于接收返回值,也可以直接使用 ThreadLocal 也可以,反正就是一个容器就行
  • 处理逻辑:这里我们就直接去根节点的值作为返回结果

4、前序遍历代码演示:

public class PreOrderDemo {public static void main(String[] args) {TrNode rootNode = buildBtree();List<String> result = new ArrayList<>();preorder(rootNode,result);System.out.println("result = " + result);}private static TrNode buildBtree() {TrNode node_C = new TrNode(null,null,"C");TrNode node_D = new TrNode(null,null,"D");TrNode node_B = new TrNode(node_C,node_D,"B");TrNode node_F = new TrNode(null,null,"F");TrNode node_E = new TrNode(null,node_F,"E");TrNode rootNode = new TrNode(node_B,node_E,"A");return rootNode;}private static void preorder(TrNode curNode, List<String> result) {// 递归退出条件if (curNode == null) {return;}// 填充本次递归调用的处理结果fillResult(result,curNode.value);// 递归遍历左子节点preorder(curNode.right,result);// 递归遍历右子节点preorder(curNode.left, result);    }// 就是封装跟节点值private static void fillResult(List<String> result, String value) {result.add(value);}
}

输出结果所示:

result = [A, E, F, B, D, C]Process finished with exit code 0

5、中序遍历代码演示:

public class PreOrderDemo {public static void main(String[] args) {TrNode rootNode = buildBtree();List<String> result = new ArrayList<>();preorder(rootNode,result);System.out.println("result = " + result);}private static TrNode buildBtree() {TrNode node_C = new TrNode(null,null,"C");TrNode node_D = new TrNode(null,null,"D");TrNode node_B = new TrNode(node_C,node_D,"B");TrNode node_F = new TrNode(null,null,"F");TrNode node_E = new TrNode(null,node_F,"E");TrNode rootNode = new TrNode(node_B,node_E,"A");return rootNode;}private static void preorder(TrNode curNode, List<String> result) {if (curNode == null) {return;}preorder(curNode.left, result);// 只是这里不一样,其他都是一模一样fillResult(result,curNode.value);preorder(curNode.right,result);}private static void fillResult(List<String> result, String value) {result.add(value);}
}

输出结果所示:

result = [C, B, D, A, E, F]Process finished with exit code 0

6、后序遍历代码演示:

public class PreOrderDemo {public static void main(String[] args) {TrNode rootNode = buildBtree();List<String> result = new ArrayList<>();preorder(rootNode,result);System.out.println("result = " + result);}private static TrNode buildBtree() {TrNode node_C = new TrNode(null,null,"C");TrNode node_D = new TrNode(null,null,"D");TrNode node_B = new TrNode(node_C,node_D,"B");TrNode node_F = new TrNode(null,null,"F");TrNode node_E = new TrNode(null,node_F,"E");TrNode rootNode = new TrNode(node_B,node_E,"A");return rootNode;}private static void preorder(TrNode curNode, List<String> result) {if (curNode == null) {return;}preorder(curNode.left, result);preorder(curNode.right,result);fillResult(result,curNode.value);}private static void fillResult(List<String> result, String value) {result.add(value);}
}

输出结果所示:

result = [C, D, B, F, E, A]Process finished with exit code 0

http://chatgpt.dhexx.cn/article/9Rpq7OE9.shtml

相关文章

二叉树的先序、中序、后序遍历

二叉树的先序、中序、后序遍历 1.前序遍历 前序遍历首先访问根结点然后遍历左子树&#xff0c;最后遍历右子树。在遍历左、右子树时&#xff0c;仍然先访问根结点&#xff0c;然后遍历左子树&#xff0c;最后遍历右子树。 若二叉树为空则结束返回&#xff0c;否则&#xff1a…

二叉树的先序、中序、后序遍历序列

二叉树的遍历主要有三种&#xff1a; &#xff08;1&#xff09;先(根)序遍历&#xff08;根左右&#xff09; &#xff08;2&#xff09;中(根)序遍历&#xff08;左根右&#xff09; &#xff08;3&#xff09;后(根)序遍历&#xff08;左右根&#xff09; 举个例子&…

一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)

前言 大家好&#xff0c;我是bigsai&#xff0c;在数据结构与算法中&#xff0c;二叉树无论是考研、笔试都是非常高频的考点内容&#xff0c;在二叉树中&#xff0c;二叉树的遍历又是非常重要的知识点&#xff0c;今天给大家讲讲二叉树的层序遍历。 这部分很多人可能会但是需…

二叉树知道前序和中序求后序,知道中序后序求中序

今天来总结下二叉树前序、中序、后序遍历相互求法&#xff0c;即如果知道两个的遍历&#xff0c;如何求第三种遍历方法&#xff0c;比较笨的方法是画出来二叉树&#xff0c;然后根据各种遍历不同的特性来求&#xff0c;也可以编程求出&#xff0c;下面我们分别说明。 首先&…

二叉树的前序、中序和后序遍历(Java实现)

文章目录 前言1. 中左右进行遍历&#xff1a;2. 代码实现 二、中序1. 左中右进行遍历2. 代码实现 三、后序1. 左右中进行遍历2. 代码实现 四、逆推二叉树 前言 二叉树一遍有前序、中序和后序三种遍历方式&#xff0c;不同的遍历方式有不同的用处。 二叉树遍历都是先左后右的。…

二叉树的先序,中序,后序遍历序列

二叉树有三种遍历&#xff1a; 1. 先序遍历&#xff1a; &#xff08;根左右&#xff09; 2.中序遍历 &#xff1a; &#xff08;左根右&#xff09; 3.后序遍历&#xff1a; &#xff08;左右根&#xff09; 举个例子&#xff1a;&#xff08;以下动画图转载自https://blo…

如何判断二叉树的前序,中序,后序遍历

文章目录 前言一、如何判断二叉树的前序&#xff0c;中序&#xff0c;后序遍历&#xff1f;二、已知二叉树的前序遍历和中序遍历&#xff0c;如何得到它的后序遍历&#xff1f;三、程序实现总结 前言 最近复习题中看到二叉树&#xff0c;对于它的前序&#xff0c;中序&#xf…

关于二叉树的前序、中序、后序三种遍历

二叉树遍历分为三种&#xff1a;前序、中序、后序&#xff0c;其中序遍历最为重要。为啥叫这个名字&#xff1f;是根据根节点的顺序命名的。 比如上图正常的一个满节点&#xff0c;A&#xff1a;根节点、B&#xff1a;左节点、C&#xff1a;右节点&#xff0c;前序顺序是ABC&a…

二叉树顺序存储之 前序,中序 ,后序遍历

二叉树遍历的概念&#xff1a; 二叉树的遍历是指从根结点出发&#xff0c;按照某种次序依次访问二叉树中的所有结点&#xff0c;使得每个结点被访问一次且仅被访问一次。 1、前序遍历 先输出当前结点的数据&#xff0c;再依次遍历输出左结点和右结点 如下图二叉树分析&#…

二叉树的前序、中序和后序遍历

目录 文章目录 目录前言一、二叉树遍历是什么&#xff1f;二、二叉树遍历的种类 1.前序遍历2.中序遍历3.后序遍历总结 前言 例如&#xff1a;跟着其他的大神学习了二叉树的遍历&#xff0c;下面简单介绍一下二叉树遍历的知识。 &#xff08;我是一个纯小白&#xff09; 一、二…

二叉树的前序,中序,后序遍历

前序遍历&#xff1a;根节点->左子树->右子树&#xff08;根->左->右&#xff09; 中序遍历&#xff1a;左子树->根节点->右子树&#xff08;左->根->右&#xff09; 后序遍历&#xff1a;左子树->右子树->根节点&#xff08;左->右->根&a…

二叉树的前序、中序、后序遍历

文章目录 前言一、用递归法实现遍历1.1 前序遍历1.2 中序遍历1.3 后序遍历 二、用迭代法实现遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历2.3.1 后序解法一2.3.2 后序解法二 三、测试验证 前言 本文主要记录二叉树的遍历方法&#xff0c;文章的主要知识点来源为&#xff1a; htt…

二叉树中已知前序和中序求其后序(图解加技巧让你轻松掌握)

一 首先咱得了解二叉树的结构&#xff0c;和前序/中序/后序遍历分别是什么。 1&#xff1a;什么是根和左右孩子&#xff1a;二叉树的每个节点都可以作为根&#xff0c;每个根下面的叫左右孩子&#xff0c;也可以没有孩子 ​ 实际使用中会如下图A是根左孩子是B,右孩子是C&a…

二叉树的前序、中序、后序

一、概念 二叉树遍历分为三种&#xff1a;前序、中序、后序&#xff0c;其中序遍历最为重要。 二、特点 A&#xff1a;根节点、B&#xff1a;左节点、C&#xff1a;右节点; 前序顺序是ABC&#xff08;根节点排最先&#xff0c;然后同级先左后右&#xff09;&#xff1b;中序…

数据结构:二叉树(先、中、后序)

一、实现功能描述&#xff1a; 1、使用先序序列来创建二叉树&#xff0c;并使用递归算法实现先序、中序、后序输出。 2、使用先序序列来创建二叉树&#xff0c;并使用非递归算法实现先序、中序、后序输出。 3、使用中序、后序的序列来创建二叉树&#xff0c;并使用先序输出。 …

二叉树的先序、中序、后序遍历超详解

以上图为基础 ①前序遍历的方式是&#xff1a;首先访问根节点&#xff0c;然后访问左子树&#xff0c;最后访问右子树。 前序遍历序列&#xff1a;F C A D B E H G M ②中序遍历的方式是&#xff1a;首先访问左子树&#xff0c;接着访问根结点&#xff0c;最后访问右子树。 中序…

二叉树的先序、中序、后序以及层次遍历

二叉树的先序、中序、后序以及层次遍历 方法&#xff1a;在遍历二叉树的时候&#xff0c;一个节点的遍历我们把它看做要经过它三次(下图红色区域)。 当经过一次&#xff0c;被写出来的点&#xff0c;我们称它为先序遍历。 当经过两次&#xff0c;被写出来的点&#xff0c;我…

二叉树的遍历(先序、中序、后序和层次法)

一、二叉树的遍历 ●遍历是指按指定的规律从根结点开始&#xff0c;对二叉树中的每个结点遍历一次且仅遍历一次。 ●遍历可以采用递归方法&#xff08;程序简单&#xff09;和非递归方法&#xff08;程序稍复杂&#xff09;。从中可以寻出“足迹”。 例如下列一颗简单的二叉树…

原生ajax的实现步骤

原生ajax的实现步骤 创建ajax对象 var xhr new XMLHttpRequest(); 告诉ajax请求地址以及请求方式&#xff08;ajax下的open方法&#xff09; xhr.open(‘get’,’http://www.example.com’); 第一个参数为请求方式&#xff0c;第二个参数为请求地址/服务器端对应的路由请求地…

2、原生AJAX

目录 1、GET请求 (1)ajax (2)js路由 2、POST请求 &#xff08;1&#xff09;ajax &#xff08;2&#xff09;js路由 3、服务端响应JOSN数据 &#xff08;1&#xff09;ajax &#xff08;2&#xff09;js路由 4、IE缓存问题 &#xff08;1&#xff09;ajax &#xf…