问题描述

请根据下述算法编写一个程序,系统地访问给定二叉树的所有节点。

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++实现相关推荐

  1. 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...

    二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (2008-05-04 17:52:49) 标签: 杂谈 C++ 二叉树的先序,中序,后序遍历以及线索二叉树的遍历 头文件 //*********** ...

  2. 树的先序/中序/后序遍历

    树的结构如下: 先序(深度搜索遍历DFS):先顶点,再左边节点,接着右边节点 前序结果:ABDEHICFG 中序:先左边节点,再顶点,最后右边节点 中序结果:DBHEIAFCG 后序:先左边节点,然后 ...

  3. 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

    本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...

  4. 二叉树的前序中序后序遍历java代码实现

    1.前序遍历概述 前序遍历(VLR) 是二叉树遍历的一种,也叫做先根遍历.先序遍历.前序周游,可记做根左右.前序遍历首先访问根结点然后遍历左子树,最后遍历右子树. 若二叉树为空则结束返回,否则: (1 ...

  5. C++用类实现二叉树的创建,前序中序后序遍历(附完整代码)

    C++用类实现二叉树的创建,前序中序后序遍历(附完整代码) 前序.中序.后序遍历 直接上代码 前序.中序.后序遍历 二叉树的遍历分为前序遍历,中序遍历和后序遍历三种遍历方法.前序遍历的顺序为" ...

  6. 二叉树的前序中序后序遍历

    二叉树的前序中序后序遍历 二叉树的遍历 前序遍历 中序遍历 后序遍历 总结 二叉树的遍历 二叉树的遍历有前序遍历,中序遍历,后序遍历三种. 今天我把二叉树的遍历方法给大家总结一下,也算对我自己学习的一 ...

  7. 二叉树遍历(递归实现前序/中序/后序遍历)

    1. 准备工作 我们先定义一棵普通的二叉树,如下图 2. 前序遍历 通过递归进行遍历: 如果二叉树为空,则操作返回: 如果非空,否则从根结点开始,然后遍历左子树,再遍历右子树. 前序遍历的结果是:AB ...

  8. 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++

    a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...

  9. 前序中序、中序后序以及前序后序构造二叉树

    文章目录 前序中序 中序后序 前序后序 定义的树节点如下, class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { ...

  10. 序列化和反序列化二叉树 -----前序,中序,后序,层序

    目录 一.序列化和反序列化 1.什么是序列化和反序列化 二.前序遍历 1.序列化 1.问题分析 2.代码实现 2.反序列化 1.问题分析 2.代码实现 三.后序遍历 1.序列化 1.思路分析 2.代码 ...

最新文章

  1. mysql过滤复制的实现
  2. js一个按钮弹出两个按钮_没有电位器,用两个按钮可以实现变频器调速吗?
  3. python版本的服务器
  4. 检查可执行文件所需要的共享库
  5. PAT甲题题解-1059. Prime Factors (25)-素数筛选法
  6. 面向对象程序设计概述(金老师第一讲)
  7. html 图片旋转插件,jQuery插件expander实现图片翻转特效
  8. 开源私有云盘python_用Seafile不花钱搭建高安全性局域网私有云盘
  9. jQuery打造智能提示插件
  10. linux安装opencv让输入密码,Linux下安装OpenCV步骤
  11. Landsat 8 地表反射率数据介绍—— Landsat 8 Surface Reflectance Tier 1
  12. 模糊聚类划分matlab代码,模糊C均值聚类算法(原理+Matlab代码) - 全文
  13. 网络安全宣传周:强调个人信息保护│预防个人信息泄露实操指南
  14. 模仿某招聘网站的Js搜索菜单
  15. vcm驱动芯片原理_每周一品 · 音圈电机(VCM)中的磁性材料
  16. matlab怎么调用桌面文件,Matlab界面Desktop操作桌面简介
  17. K8s 所有常用端口
  18. Pandownload 下线了,我花了 30 分钟自己搭建了一个网盘!
  19. 笨笨对面向对象的理解
  20. 沃达丰已在英国7城推出5G网络 部分设备由华为提供

热门文章

  1. php把数据存到cookie,php – 在cookie中存储数组
  2. bzoj5369 [Pkusc2018]最大前缀和(状压dp)
  3. AI音箱工作原理浅析
  4. LED发光原理(笔记)
  5. 矩阵论(四)——矩阵的广义逆
  6. ajax报502错误,ajax服务器返回502
  7. 服务器网页上传附件按钮无法使用怎么解决,IE上传附件无法点击确定按钮的具体处理方法...
  8. windows服务器迁到_windows服务器搬迁指南
  9. c/c++文本单词查询
  10. java 一元二次方程_java一元二次方程求根