树的前序、中序、后序遍历 | Tree Walk | C/C++实现
问题描述
请根据下述算法编写一个程序,系统地访问给定二叉树的所有节点。
1.按照根结点、左子树、右子树的顺序输出结点编号。这称为树的前序遍历(Preorder Tree Walk)。
2.按照左子树、根结点、右子树的顺序输出结点编号。这称为树的中序遍历(Inorder Tree Walk)。
3.按照左子树、右子树、根结点的顺序输出结点编号。这称为树的后序遍历(Postorder Tree Walk)。
设给定二叉树拥有n个结点,编号分别为0至n-1。
输入: 第1行输入结点的个数n。接下来n行按照下述格式输入结点的信息,每个结点占1行。
id left right
id 为结点编号,left为左子结点编号,right为右子结点编号。不存在子结点时left(right)为-1.
输出:
第1行输出"Preorder",第2行按前序遍历的顺序输出结点的编号。
第3行输出"Inorder",第4行按中序遍历的顺序输出结点的编号。
第5行输出"Postorder",第6行按后续遍历的顺序输出结点编号。
结点编号前输出1个空格。
限制: 1 ≤ n ≤ 25
输入示例
9
0 1 4
1 2 3
2 -1 -1
3 -1 -1
4 5 8
5 6 7
6 -1 -1
7 -1 -1
8 -1 -1
输出示例
Preorder
0 1 2 3 4 5 6 7 8
Inorder
2 1 3 0 6 5 7 4 8
Postorder
2 3 1 6 7 5 8 4 0
讲解
Preorder、Inorder、Postorder遍历均为递归算法,具体如下。
Preorder遍历
preParse(u)if u == NILreturnprint upreParse(T[u].left)preParse(T[u].right)
Inorder遍历
inParse(u)if u == NILreturninParse(T[u].left)print uinParse(T[u].right)
Postorder遍历
postParse(u)if u == NILreturnpostParse(T[u].left)postParse(T[u].right)print u
以preParse(u)为例,程序先访问u(这里用print u输出结点编号),然后执行preParse(T[u].left)访问u的左子树,处理完成后再执行preParse(T[u].right)访问u的右子树。u等于NIL时表示没有后续结点,函数结束。
同理,只要改变print u的位置,我们就可以实现不同的遍历算法了。Inorder遍历要把print u放在遍历左子树和遍历右子树的中间,而Postorder遍历则是在遍历左子树和右子树之后再执行print u。
AC代码如下
#include<stdio.h>
#define MAX 100000
#define NIL -1struct Node { int p, l, r; };
struct Node T[MAX];
int n;//前序遍历
void preParse(int u){if(u == NIL) return;printf(" %d", u);preParse(T[u].l);preParse(T[u].r);
} //中序遍历
void inParse(int u){if(u == NIL) return;inParse(T[u].l);printf(" %d", u);inParse(T[u].r);
} //后序遍历
void postParse(int u){if(u == NIL) return;postParse(T[u].l);postParse(T[u].r);printf(" %d", u);
} int main(){int i, v, l, r, root;scanf("%d", &n);for(i = 0; i < n; i++){T[i].p = NIL;}for(i = 0; i < n; i++){scanf("%d %d %d", &v, &l, &r);T[v].l = l;T[v].r = r;if(l != NIL) T[l].p = v;if(r != NIL) T[r].p = v;}for(i = 0; i < n; i++) if (T[i].p == NIL) root = i;printf("Preorder\n");preParse(root);printf("\n");printf("Inorder\n");inParse(root);printf("\n");printf("Postorder\n");postParse(root);printf("\n");return 0;
}
树的前序、中序、后序遍历 | Tree Walk | C/C++实现相关推荐
- 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...
二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (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.代码 ...
最新文章
- mysql过滤复制的实现
- js一个按钮弹出两个按钮_没有电位器,用两个按钮可以实现变频器调速吗?
- python版本的服务器
- 检查可执行文件所需要的共享库
- PAT甲题题解-1059. Prime Factors (25)-素数筛选法
- 面向对象程序设计概述(金老师第一讲)
- html 图片旋转插件,jQuery插件expander实现图片翻转特效
- 开源私有云盘python_用Seafile不花钱搭建高安全性局域网私有云盘
- jQuery打造智能提示插件
- linux安装opencv让输入密码,Linux下安装OpenCV步骤
- Landsat 8 地表反射率数据介绍—— Landsat 8 Surface Reflectance Tier 1
- 模糊聚类划分matlab代码,模糊C均值聚类算法(原理+Matlab代码) - 全文
- 网络安全宣传周:强调个人信息保护│预防个人信息泄露实操指南
- 模仿某招聘网站的Js搜索菜单
- vcm驱动芯片原理_每周一品 · 音圈电机(VCM)中的磁性材料
- matlab怎么调用桌面文件,Matlab界面Desktop操作桌面简介
- K8s 所有常用端口
- Pandownload 下线了,我花了 30 分钟自己搭建了一个网盘!
- 笨笨对面向对象的理解
- 沃达丰已在英国7城推出5G网络 部分设备由华为提供
热门文章
- php把数据存到cookie,php – 在cookie中存储数组
- bzoj5369 [Pkusc2018]最大前缀和(状压dp)
- AI音箱工作原理浅析
- LED发光原理(笔记)
- 矩阵论(四)——矩阵的广义逆
- ajax报502错误,ajax服务器返回502
- 服务器网页上传附件按钮无法使用怎么解决,IE上传附件无法点击确定按钮的具体处理方法...
- windows服务器迁到_windows服务器搬迁指南
- c/c++文本单词查询
- java 一元二次方程_java一元二次方程求根