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

article/2025/9/17 17:25:57

文章目录

  • 前言
  • 一、如何判断二叉树的前序,中序,后序遍历?
  • 二、已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
  • 三、程序实现
  • 总结


前言

最近复习题中看到二叉树,对于它的前序,中序,后序遍历的判断有些模糊,后经查阅资料,将学习过程记录在博客中。


提示:以下是本篇文章正文内容

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

对一棵二叉树进行遍历,我们可以采取3中顺序进行遍历,分别是前序遍历、中序遍历和后序遍历。这三种方式是以访问父节点的顺序来进行命名的。假设根节点是N,左节点是L,右节点是R,那么对应的访问遍历顺序如下:

  • 前序遍历 N(根节点)->L(左节点)->R (右节点)
  • 中序遍历 L(左节点)->N(根节点)->R (右节点)
  • 后序遍历 L(左节点)->R(右节点)->N (根节点)

所以,对于以下这棵树,三种遍历方式的结果是:

在这里插入图片描述

  • 前序遍历 ABCDEF
  • 中序遍历 CBDAEF
  • 后序遍历 CDBFEA

如果还是不明白怎样判断的,那么下面是详细描述

二、已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?

其实,只要知道其中任意两种遍历的顺序,我们就可以推断出剩下的一种遍历方式的顺序,这里我们只是以:知道前序遍历和中序遍历,推断后序遍历作为例子,其他组合方式原理是一样的。要完成这个任务,我们首先要利用以下四个特性

  • 特性1,对于前序遍历,第一个肯定是根节点;
  • 特性2,对于后序遍历,最后一个肯定是根节点;
  • 特性3,利用前序或后序遍历,确定根节点,在中序遍历中,根节点的两边就可以分出左子树和右子树;
  • 特性4,对左子树和右子树分别做前面3点的分析和拆分,相当于做递归,我们就可以重建出完整的二叉树;

范例如下(示例):

我们以一个例子做一下这个过程,假设:
前序遍历的顺序是: CABGHEDF
中序遍历的顺序是: GHBACDEF第一步,我们根据特性1,可以得知根节点是C,然后,根据特性3,我们知道左子树是:GHBA,右子树是:DEFC/     \GHBA      DEF
第二步,取出左子树,左子树的前序遍历是:ABGH,中序遍历是:GHBA(从上面题目中得出)
根据特性13,得出左子树的根节点是A,并且A没有右子树。C/     \A        DEF/GHB
第三步,使用同样的方法,前序是BGH,中序是GHB,得出根节点是B,GH为B的左子树,并且B没有右子树。
再看前序中GH,G在H的前面,也就是说,G是先前序遍历访问的,则得到H是G的左子树C/     \A        DEF/B/    G / H     第四步,回到右子树,它的前序是EDF,中序是DEF,依然根据特性13,得出根节点是E,左节点是D,右节点为F。C/     \A        E/        /    \B         D      F/    G / H     到此,我们得到了这棵完整的二叉树,因此,它的后序遍历就是:HGBADFEC

三、程序实现

下面我们使用程序来实现根据前序遍历和中序遍历得到后续遍历。
首先我们需要建立节点的实体类:

/*** 二叉树的节点数据结构*/
public class TreeNode {private String key = null;private String data = null;public boolean isVisted = false;/*** 左儿子节点*/public TreeNode leftChild = null;/*** 右儿子节点*/public TreeNode rightChild = null;/*** 默认构造方法*/public TreeNode(){}/*** @param key  层序编码* @param data 数据域*/public TreeNode(String key, String data){this.setKey(key);this.setData(data);this.leftChild = null;this.rightChild = null;}/*** 序号*/public String getKey() {return key;}public void setKey(String key) {this.key = key;}/*** 值*/public String getData() {return data;}public void setData(String data) {this.data = data;}
}

具体实现代码

/*** 给出前序遍历和终须遍历,求得二叉树及后续遍历* Created by sschen on 17/5/2.** 前序遍历    N->L->R* 中序遍历    L->N->R* 后序遍历    L->R->N** 特性A,对于前序遍历,第一个肯定是根节点;* 特性B,对于后序遍历,最后一个肯定是根节点;* 特性C,利用前序或后序遍历,确定根节点,在中序遍历中,根节点的两边就可以分出左子树和右子树;* 特性D,对左子树和右子树分别做前面3点的分析和拆分,相当于做递归,我们就可以重建出完整的二叉树;*/
public class BinaryTreeFind {public static void main(String[] args) {/***             A*          /        \*        B           C*      /     \          \*     D       E          F*   /        /  \           \*  G        H    I            J*   \      /*    K    L** 前序遍历: ABDGKEHLICFJ* 中序遍历; GKDBLHEIACFJ* 后续遍历: KGDLHIEBJFCA*/String pr = "ABDGKEHLICFJ";String in = "GKDBLHEIACFJ";TreeNode node = GetTree(pr, in, "root");postOrder(node);}/*** 递归计算节点列表* @param pr 前序遍历字符串* @param in 中序遍历字符串* @param index 层级序号* @return 节点*/private static TreeNode GetTree(String pr, String in, String index){if (pr == "" || in == "") {//如果字符串为空直接返回空值return null;}//前序遍历的第一个节点必然是该段根节点String firstNodeValue = pr.substring(0, 1);TreeNode node = new TreeNode(index, firstNodeValue);if (in.length() == 1) {//中序遍历没有节点了,直接返回自身return node;}//得到跟节点在中序遍历中的位置int iLeftLength = in.indexOf(firstNodeValue);if (iLeftLength == 0) {//已经是中序遍历的第一个元素,则代表没有左儿子node.leftChild = null;}else {node.leftChild = GetTree(pr.substring(1, iLeftLength + 1), in.substring(0, iLeftLength),index + "-L");}if (iLeftLength == in.length() - 1) {//已经是中序遍历的最后一个节点,代表没有右儿子node.rightChild = null;}else {node.rightChild = GetTree(pr.substring(iLeftLength + 1), in.substring(iLeftLength + 1),index + "-R");}return node;}/*** 对二叉树进行后续遍历* @param subTree 二叉树*/public static void postOrder(TreeNode subTree) {if (subTree != null) {postOrder(subTree.leftChild);postOrder(subTree.rightChild);visted(subTree);}}public static void visted(TreeNode subTree){subTree.isVisted=true;System.out.println("key:" + subTree.getKey() + "--name:" + subTree.getData());;}
}

执行结果为

key:root-L-L-L-R--name:K
key:root-L-L-L--name:G
key:root-L-L--name:D
key:root-L-R-L-L--name:L
key:root-L-R-L--name:H
key:root-L-R-R--name:I
key:root-L-R--name:E
key:root-L--name:B
key:root-R-R-R--name:J
key:root-R-R--name:F
key:root-R--name:C
key:root--name:A

总结

掌握了二叉树的四个特性,也就可以清楚的判断二叉树的前序,中序,后序遍历。


http://chatgpt.dhexx.cn/article/yqTepiyL.shtml

相关文章

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

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

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

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

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

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

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

前序遍历:根节点->左子树->右子树(根->左->右) 中序遍历:左子树->根节点->右子树(左->根->右) 后序遍历:左子树->右子树->根节点(左->右->根&a…

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

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

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

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

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

一、概念 二叉树遍历分为三种:前序、中序、后序,其中序遍历最为重要。 二、特点 A:根节点、B:左节点、C:右节点; 前序顺序是ABC(根节点排最先,然后同级先左后右);中序…

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

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

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

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

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

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

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

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

原生ajax的实现步骤

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

2、原生AJAX

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

AJAX ------ 原生 AJAX

原生 AJAX GET 请求 一. 实例要求:点击按钮,发送GET请求,在 div 中做呈现 HELLO AJAX 创建 server.js 文件 //1.引入expressconst express require(express);//2.创建应用对象const app express();//3.创建路由规则//requset是对请求报…

关于原生的Ajax详解

一、Ajax对于前端开发的意义 我们常称Ajax是前端开发者的梦想,为什么这么说呢?Ajax的出现揭开了无刷更新页面数据的时代,JavaScript的实用性也得到了巨大的提升,网页可以在不重载的情况下,实现异步更新,而在…

猿创征文 | 如何使用原生AJAX请求数据

目录 一、什么是AJAX 二、AJAX请求数据的步骤 第一步:创建XMLHttpRequest的实例对象 第二步:打开一个连接 open() 第三步:设置请求头 setRequestHeader() 第四步:发送请求 send() 第五步:接收响应 三、常用请求…

原生ajax和Jquery的ajax

目录 原生ajax 传统请求(同步方式)的问题 Ajax优势和作用 Ajax请求与传统请求的区别: ajax原理(方法,属性 ) XMLHttpRequest open send 属性 readyState tatus responseText 事件 ajax实现步骤…

原生Ajax 超详细

目录 今天来聊一聊前后端交互的重要工具AJAX 为什么要学习Ajax jQuery 中发起 Ajax 请求最常用的三个方法如下: $.get() $.post() $.ajax() 接口的概念 什么是接口文档 接口文档包括 案例 - 图书管理 完整代码如下: 今天来聊一聊前后端交互的重要…

03 原生Ajax写法

目录 一、原生Ajax写法 1.原生Ajax-GET写法 2.原生Ajax-POST写法 二、GET/POST的区别 下图为本文的核心 一、原生Ajax写法 1.原生Ajax-GET写法 1.创建xhr对象 const xhr new XMLHttpRequest() 2.设置url地址与请求方式 xhr.open(GET, http://ajax-api.itheima.net/api/a…

异步请求ajax介绍,原生ajax,$.ajax基本使用

在这篇文章中,我们将学习ajax的工作原理,已经使用原生的ajax和jquery的ajax来进行编程练习。 目录 ajax原理介绍 什么是ajax ajax的优点 ajax的应用场景 ajax原理分析 使用ajax 原生ajax jquery使用ajax $.ajax() $.get() $.post() 总结 aj…