给出一棵二叉树的中序和前序遍历,输出它的后序遍历。
Input

本题有多组数据,输入处理到文件结束。

每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点。

接下来的一行每行包括n个整数,表示这棵树的中序遍历。

接下来的一行每行包括n个整数,表示这棵树的前序遍历。

3<= n <= 100

Output

每组输出包括一行,表示这棵树的后序遍历。
Sample Input
7
4 2 5 1 6 3 7

1 2 4 5 3 6 7

Sample Output

4 5 2 6 7 3 1 
 
这里后序遍历写了一个非递归,嗯,为考研做准备。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int Data;
struct Node *Left,*Right;
}Node;
int q[],z[];///q记录前序遍历 z记录中序遍历
Node* creatNode() {
Node *node = (Node *)malloc(sizeof(Node));
if(node == NULL) exit();
node -> Left = node -> Right = NULL;
return node;
}
Node* rTree(int q1,int q2,int z1,int z2) {
Node *node = creatNode();
node -> Data = q[q1];
for(int i = z1;i <= z2;i ++) {
if(z[i] == q[q1]) {
if(i != z1) node -> Left = rTree(q1 + ,q1 + i - z1,z1,i - );
if(i != z2) node -> Right = rTree(q1 + i - z1 + ,q2,i + ,z2);//右儿子构建
break;
}
}
return node;
}
//void postOrder(Node *node) {
// if(node == NULL) return;
// postOrder(node -> Left);
// postOrder(node -> Right);
// printf("%d ",node -> Data);
//}
//void postOrder(Node *node) {///下标标记
// Node *s[100];
// char num[100] = {0};
// int c = 0;
// s[c ++] = node;
// while(c) {
// Node *temp = s[c - 1];
// if(num[c - 1]) {
// num[c - 1] = 0;
// printf("%d ",s[-- c] -> Data);
// }
// else {
// num[c - 1] = 1;
// if(temp -> Right) {
// s[c ++] = temp -> Right;
// }
// if(temp -> Left) {
// s[c ++] = temp -> Left;
// }
// }
// }
//}
void postOrder(Node *node) {///前驱结点判断
Node *s[],*la;
int c = ;
s[c ++] = node;
while(c) {
Node *temp = s[c - ];
if(temp -> Left == temp -> Right && temp -> Left == NULL || la == temp -> Left || la == temp -> Right) {
printf("%d ",s[-- c] -> Data);
la = temp;
}
else {
if(temp -> Right && la != temp -> Right) {
s[c ++] = temp -> Right;
}
if(temp -> Left && la != temp -> Left) {
s[c ++] = temp -> Left;
}
}
}
}
int main() {
int n;
Node *tree;
while(~scanf("%d",&n)) {
for(int i = ;i < n;i ++) {
scanf("%d",&z[i]);
}
for(int i = ;i < n;i ++) {
scanf("%d",&q[i]);
}
tree = rTree(,n - ,,n - );
postOrder(tree);
putchar('\n');
}
return ;
}

HRBUST 2040 二叉树的遍历的更多相关文章

  1. 二叉树的遍历(递归,迭代,Morris遍历)

    二叉树的三种遍历方法: 先序,中序,后序,这三种遍历方式每一个都可以用递归,迭代,Morris三种形式实现,其中Morris效率最高,空间复杂度为O(1). 主要参考博客: 二叉树的遍历(递归,迭代, ...

  2. C++ 二叉树深度优先遍历和广度优先遍历

    二叉树的创建代码==>C++ 创建和遍历二叉树 深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. //深度优先遍历二叉树void depthFirstSearch(Tree r ...

  3. 二叉树的遍历(递归,迭代,Morris遍历)

    二叉树的遍历: 先序,中序,后序: 二叉树的遍历有三种常见的方法, 最简单的实现就是递归调用, 另外就是飞递归的迭代调用, 最后还有O(1)空间的morris遍历: 二叉树的结构定义: struct ...

  4. [Leetcode] Binary tree level order traversal二叉树层次遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  5. 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)

    前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...

  6. C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解

    剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...

  7. python3实现二叉树的遍历与递归算法解析

    1.二叉树的三种遍历方式 二叉树有三种遍历方式:先序遍历,中序遍历,后续遍历  即:先中后指的是访问根节点的顺序   eg:先序 根左右   中序 左根右  后序  左右根 遍历总体思路:将树分成最小 ...

  8. 二叉树的遍历--C#程序举例二叉树的遍历

    二叉树的遍历--C#程序举例二叉树的遍历 关于二叉树的介绍笨男孩前面写过一篇博客 二叉树的简单介绍以及二叉树的存储结构 遍历方案 二叉树的遍历分为以下三种: 先序遍历:遍历顺序规则为[根左右] 中序遍 ...

  9. 数据结构与算法之PHP实现二叉树的遍历

    一.二叉树的遍历 以某种特定顺序访问树中所有的节点称为树的遍历,遍历二叉树可分深度优先遍历和广度优先遍历. 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.可以细分 ...

随机推荐

  1. [ARM-Linux开发] 嵌入式 linux如何生成ko文件

    hello.c文件如下 驱动程序: #include <Linux/***.h> 是在linux-2.6.29/include/linux下面寻找源文件. #include <asm ...

  2. [数据结构 - 第3章] 线性表之顺序表(C++实现)

    一.类定义 顺序表类的定义如下: #ifndef SEQLIST_H #define SEQLIST_H typedef int ElemType; /* "ElemType类型根据实际情况 ...

  3. Python删除文件,空文件夹,非空文件夹

    首先,在Python中文件路径是这种格式: file_path1 = r'F:\test\1' 删除文件,命令 os.remove(file_path1) 删除空文件夹,命令 os.rmdir(fil ...

  4. jQuery正则校验

    jQuery正则校验 银行卡号 //验证银行卡号,bankno为银行卡号function luhnCheck(){ var bankno = $.trim($("#bankNoInp&quo ...

  5. 今天七夕节,外面下着大雨,用Python的tkinter做一个下爱心雨的特效,发给妹子

    今天七夕,还下着雨,刚好想做一个下着爱心雨的特效 准备图片素材 1.美图秀秀找一个爱心图,大小就50*50就可以,生成的是一个png格式文件 2.由于canvas.create_image只支持gif ...

  6. redis常用命令及持久化机制

    redis  常用命令 查找redis服务文件 find / -name  redis-server 查找配置文件 find / -name redis.conf 启动服务时候,要指定配置文件 启动r ...

  7. WAV文件读取

    WAV是一种以RIFF为基础的无压缩音频编码格式,该格式以Header.Format Chunk及Data Chunk三部分构成. 本文简要解析了各部分的构成要素,概述了如何使用C++对文件头进行解析 ...

  8. 读文件时出现这个错误 'utf-8' codec can't decode byte 0xba in position 21: invalid start byte

    ''' file2 文件内容: 很任性wheniwasyoung ''' 源代码: f = open("file2",'r',encoding="utf-8") ...

  9. Python知识点总结篇(三)

    文件操作 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量: 通过句柄对文件进行操作: 关闭文件: with:自动关闭文件: with open('log', 'r') as f: ... 文件 ...

  10. 个人学习笔记:C语言程序结构

    个人笔记:C语言程序 函数 语句 输入输出对象 标识符 关键字 函数 一个C语言源程序,是由一个或多个函数定义顺序组成的,其中必须有一个函数名为main的主函数.C语言源程序中的函数是指完成特定数据处 ...