树的前序中序后序遍历
1.前序遍历
前序遍历是指输出当前节点,再输出左子树,最后输出右子树。
对于上图的前序遍历顺序为:
先输出1,1的左子树2存在 --> 输出2,2的左子树4存在 --> 输出4,4的左子树不存在,右子树6存在 --> 输出6,6的左子树不存在,右子树7存在 --> 输出7,7的左子树不存在,右子树不存在。
此时我们观察到4的左右子树都已经遍历完(即2的左子树遍历完),开始访问2的右子树,2的右子树为空。
访问1的右子树,接下来的顺序依次是3 --> 5。遍历完成结束
所以前序遍历结果为:1 --> 2 --> 4 --> 6 -- >7 -->3 --> 5.
2.中序遍历
中序遍历是指先输出当前节点左子树,再输出当前节点,最后输出当前节点右子树。
对于上图的中序遍历顺序为:
1有左子树,访问2
2有左子树,访问4
4左子树为空,输出4,访问右子树6
6左子树为空,输出6,访问右子树7
7左子树为空,输出7,右子树为空
4作为2的左子树遍历完,输出2,访问2的右子树,2的右子树为空
2作为1的左子树遍历完成,输出1,访问1的右子树3
3有左子树,访问5
5左子树为空,输出5,右子树为空
5作为3的左子树遍历完成,输出5,右子树为空。
整棵树遍历结束。
中序遍历结果为:
4 --> 6 --> 7 --> 2 --> 1 --> 5 --> 3
3.后序遍历
后序遍历是指先输出当前节点左子树,再输出右子树,最后输出当前节点。
对于上图的后序遍历结果为:
1有左子树访问2
2有左子树访问4
4左子树为空,访问右子树6
6左子树为空,访问右子树7
7的左右子树都为空,输出7
6的左右子树遍历完,输出6
4的左右子树遍历完,输出4
2的左子树遍历完,右子树为空,输出2
1的左子树遍历完,访问右子树3
3有左子树访问5
5的左右子树为空输出5
3的左子树遍历完,右子树为空,输出3
1的左右子树遍历完,输出1
后序遍历顺序为:7 --> 6 --> 4 --> 2 --> 5 --> 3 --> 1
4.根据前中序结果推导出树的结构
代码实现
利用上述结果
前序遍历:1 --> 2 --> 4 --> 6 -- >7 -->3 --> 5
中序遍历:4 --> 6 --> 7 --> 2 --> 1 --> 5 --> 3
1)根据前序遍历先输出当前节点、再左子树、最后右子树顺序,我们可以知道每一个节点一定是某一棵树的根节点。例如1为整棵树的根节点。
2)根据中序遍历先输出左子树、再当前节点、再最后右子树的顺序,我们知道根节点一定是在中心位置的,根节点左边的节点一定是他的左子树,右边的节点一定是他的右子树。根据前序结果我们知道根节点为1,所以根据中序遍历结果我们可以知道根节点1的左子树节点有4、6、7、2,右子树节点有5、3。
3)对于4672这颗子树,根据前序结果,我们知道根节点为2,所以根据中序遍历结果2的左子树有467,无右子树。
4)对于467这颗子树,根据前序遍历结果,我们知道根节点为4,所以根据中序遍历结果4的左子树为空,右子树为67。
5)对67这颗子树,根据前序遍历结果,我们知道根节点为6,所以根据中序遍历结果4的左子树为空,右子树为7。
6)自此,根节点1的整个左子树遍历完成。结果如图所示:
7)对于根节点1的右子树53,根据前序遍历我们很容易推出3为下一棵子树的根节点,根据中序遍历推出5为3的左子树。
8)自此,整棵树根据前序中序结果推导完毕。
5.根据中后序结果推导出树的结构
代码实现
利用上述结果
中序遍历:4 --> 6 --> 7 --> 2 --> 1 --> 5 --> 3
后序遍历:7 --> 6 --> 4 --> 2 --> 5 --> 3 --> 1
1)根据后序遍历先输出左子树、再右子树、最后当前节点的顺序,我们知道后序遍历的根节点为最后一个节点1。
2)根据前面对中序遍历的分析,我们知道4672是根节点1的左子树,53是根节点1的右子树。
3)分析1左子树4672,根据后序遍历顺序,2为左子树的根节点;根据中序遍历顺序,确定467为2节点的左子树,2节点没有右子树。
4)分析2的左子树467,根据后续遍历顺序,4为根节点,根据中序遍历结果,67为4节点的右子树。
5)分析4的右子树67,根据后序遍历顺序,6为根节点,根据中序遍历结果,7为6节点的右子树。
6)根节点1的左子树全部推导完毕,右子树如法炮制,不再赘述。
树的前序中序后序遍历相关推荐
- 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...
二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (2008-05-04 17:52:49) 标签: 杂谈 C++ 二叉树的先序,中序,后序遍历以及线索二叉树的遍历 头文件 //*********** ...
- 树的先序/中序/后序遍历
树的结构如下: 先序(深度搜索遍历DFS):先顶点,再左边节点,接着右边节点 前序结果:ABDEHICFG 中序:先左边节点,再顶点,最后右边节点 中序结果:DBHEIAFCG 后序:先左边节点,然后 ...
- 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法
本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...
- 二叉树的前序中序后序遍历java代码实现
1.前序遍历概述 前序遍历(VLR) 是二叉树遍历的一种,也叫做先根遍历.先序遍历.前序周游,可记做根左右.前序遍历首先访问根结点然后遍历左子树,最后遍历右子树. 若二叉树为空则结束返回,否则: (1 ...
- C++用类实现二叉树的创建,前序中序后序遍历(附完整代码)
C++用类实现二叉树的创建,前序中序后序遍历(附完整代码) 前序.中序.后序遍历 直接上代码 前序.中序.后序遍历 二叉树的遍历分为前序遍历,中序遍历和后序遍历三种遍历方法.前序遍历的顺序为" ...
- 二叉树的前序中序后序遍历
二叉树的前序中序后序遍历 二叉树的遍历 前序遍历 中序遍历 后序遍历 总结 二叉树的遍历 二叉树的遍历有前序遍历,中序遍历,后序遍历三种. 今天我把二叉树的遍历方法给大家总结一下,也算对我自己学习的一 ...
- 二叉树遍历(递归实现前序/中序/后序遍历)
1. 准备工作 我们先定义一棵普通的二叉树,如下图 2. 前序遍历 通过递归进行遍历: 如果二叉树为空,则操作返回: 如果非空,否则从根结点开始,然后遍历左子树,再遍历右子树. 前序遍历的结果是:AB ...
- 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++
a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...
- 前序中序、中序后序以及前序后序构造二叉树
文章目录 前序中序 中序后序 前序后序 定义的树节点如下, class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { ...
- 序列化和反序列化二叉树 -----前序,中序,后序,层序
目录 一.序列化和反序列化 1.什么是序列化和反序列化 二.前序遍历 1.序列化 1.问题分析 2.代码实现 2.反序列化 1.问题分析 2.代码实现 三.后序遍历 1.序列化 1.思路分析 2.代码 ...
最新文章
- php简单算法之冒泡排序
- 分享几个用 Python 给图片添加水印的方法,简单实用
- C# 中获取CPU序列号/网卡mac地址
- 使用Navicat连接MySQL时出现2059报错的解决方法
- tensorflow版本问题导致的错误AttributeError: module ‘tensorflow‘ has no attribute ‘***‘
- python获取当前年份_Python根据当前日期取去年同星期日期
- 您是否尝试过MicroProfile Starter?
- python特殊函数__str__、__repr__和__len__
- 对象的释放Dispose和Close对比
- Mavlink 协议硬解析主要代码
- 徐起预热realme Q5系列:骁龙870+80W快充 新一代千元机皇
- 获江苏国资阿里小米等入股 苏宁易购复牌涨停
- 如何在Microsoft Excel电子表格之间交叉引用单元格
- 浪潮配置ipim_浪潮服务器管理口IP设置_IPMI设置
- java简易日历表_java简易日历代码
- 7-55 查询水果价格 (15分)
- Vue视频播放组件(Video)
- 普通人学python有意义吗_普通人学python有什么用
- db2 - 统计上一月,前两周的数据
- 面试被diss,最后却拿到offer,去还是不去?