题目如下:

Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (<=30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers
in a line are separated by a space.

Output Specification:

For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

Sample Output:

4 1 6 3 5 7 2

这是一道很直接的给出中序序列和任一其他序列生成二叉树的问题,本题给出的是后序遍历和中序遍历,利用后序遍历的“左右根”顺序我们知道,后序序列的最后一个元素一定是整棵树的根,从后向前,分别是右、左子树的根,因此通过后序序列可以找到一系列的根,他们的顺序是当前所在的根、右子树的根、左子树的根,每次在中序序列中定位出根的位置,根据中序序列“左根右”的顺序我们知道,根左边的一定是左子树,右边的一定是右子树,就这样递归解决子树问题即可,最后通过BFS来进行层序遍历。

具体实现方法为,设中序序列为inOrder,后序序列为postOrder,设置一个游标变量cur,左右范围变量left、right,cur作为一个全局变量,每次在postOrder中取出一个根,就让cur自减1,首先把拿到的根定位在inOrder中,设根所在的索引为rootIndex,首先建立当前根节点T,然后生成左子树范围left到rootIndex-1和右子树范围rootIndex+1到right,注意由于后序序列倒着走线碰到右子树,因此应该先递归T->right,再递归T->left,当发现left比right大时,说明没有子树,直接返回NULL,当发现left=right时,说明这是一个叶子结点,将结点的left和right置为NULL然后返回,最后一次递归返回时返回的是第一次创建的根结点,也就是整棵树的根,这时便得到了完整的二叉树。

接下来要进行层序遍历,只要对二叉树从根开始调用BFS即可,在结点出队时进行输出。

#include <iostream>
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <queue> using namespace std; #define MAX 40 int postOrder[MAX];
int inOrder[MAX];
int N;
int cur; typedef struct TreeNode *Tree;
struct TreeNode{ Tree left;
Tree right;
int num; }; int findRootIndex(int rootNum){ for(int i = 0;i < N; i++){
if(inOrder[i] == rootNum){
return i;
}
}
return -1; } Tree CreateTree(int left, int right){
if(left > right ) return NULL;
int root = postOrder[cur];
cur --;
int rootIndex = findRootIndex(root);
Tree T = (Tree)malloc(sizeof(struct TreeNode));
T->num = root;
if(left == right){
T->left = NULL;
T->right = NULL;
}else{
T->right = CreateTree(rootIndex+1,right);
T->left = CreateTree(left,rootIndex-1);
}
return T; } void BFS(Tree T){ bool firstout = true;
queue<Tree> q;
q.push(T); while(!q.empty()){ Tree t = q.front();
q.pop();
if(firstout){
firstout = false;
cout << t->num;
}else{
cout << " " << t->num;
}
if(t->left != NULL){
q.push(t->left);
}
if(t->right!= NULL){
q.push(t->right);
} } } int main()
{
cin >> N;
cur = N-1;
for(int i = 0; i < N; i++){
cin >> postOrder[i];
}
for(int i = 0; i < N; i++){
cin >> inOrder[i];
} Tree T = CreateTree(0,cur); BFS(T); cout << endl; return 0;
}

1020. Tree Traversals (25) -BFS的更多相关文章

  1. PAT 甲级 1020 Tree Traversals (25 分)(二叉树已知后序和中序建树求层序)

    1020 Tree Traversals (25 分)   Suppose that all the keys in a binary tree are distinct positive integ ...

  2. 【PAT】1020 Tree Traversals (25)(25 分)

    1020 Tree Traversals (25)(25 分) Suppose that all the keys in a binary tree are distinct positive int ...

  3. PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习

    1020 Tree Traversals (25分)   Suppose that all the keys in a binary tree are distinct positive intege ...

  4. PAT Advanced 1020 Tree Traversals (25 分)

    1020 Tree Traversals (25 分)   Suppose that all the keys in a binary tree are distinct positive integ ...

  5. 1020. Tree Traversals (25)

    the problem is from pat,which website is http://pat.zju.edu.cn/contests/pat-a-practise/1020 and the ...

  6. 【PAT甲级】1020 Tree Traversals (25 分)(树知二求一)

    题意: 输入一个正整数N(N<=30),给出一棵二叉树的后序遍历和中序遍历,输出它的层次遍历. trick: 当30个点构成一条单链时,如代码开头处的数据,大约1e9左右的结点编号大小,故采用结 ...

  7. PAT Advanced 1020 Tree Traversals (25) [⼆叉树的遍历,后序中序转层序]

    题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder an ...

  8. 【PAT】1020. Tree Traversals (25)

    Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...

  9. PAT (Advanced Level) 1020. Tree Traversals (25)

    递归建树,然后BFS一下 #include<iostream> #include<cstring> #include<cmath> #include<algo ...

随机推荐

  1. Linux学习之CentOS(十六)-----内存置换空间(swap)之建置(转)

    内存置换空间(swap)之建置 安装时一定需要的两个 partition 啰! 一个是根目录,另外一个就是 swap(内存置换空间), swap 的功能就是在应付物理内存不足的情况下所造成的内存延伸记 ...

  2. Spring利用反射调用接口

    首先在项目中使用java反射调用 //根据实例及参数名获得方法A Method method = event.getObj().getClass() .getMethod(event.getMetho ...

  3. linux系统下安装jdk、tomcat、mysql、redis

    一,安装jdk 1.rpm -qa | grep jdk 检测是否安装jdk 2.rpm -e --nodeps 要卸载的已有jdk名称 3.tar -zxvf jdk-7u71-linux-i586 ...

  4. URLconnection

    URLconnection 开发中最常用的两种网络请求: 1.标准Java接口(java.NET) --HttpURLConnection,可以实现简单的基于URL请求.响应功能:  2.Apache ...

  5. Linux平台安装MongoDB

    MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/download-center#community ...

  6. Flume 读取RabbitMq消息队列消息,并将消息写入kafka

    首先是关于flume的基础介绍 组件名称 功能介绍 Agent代理 使用JVM 运行Flume.每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks. Client ...

  7. ZooKeeper之(一)ZooKeeper是什么

    1.1 产生背景 当今是个分布式.集群.云计算等名词满天飞的时代.造成这种局面的一个重要因素就是,单一机器的处理能力已经不能满足我们的需求,不得不采用由多台机器组成的服务集群.服务集群对外提供服务的过 ...

  8. Redis之(三)管理命令

    4.1键管理 通过学习五种数据类型的操作命令,可以发现,Redis对每种数据的处理之前,都要先指定该数据的key,然后再指定对该数据进行何种操作. Redis中的key有点类似于Java中的变量名,起 ...

  9. React Native(一) FlexBox布局

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/53241550 本文出自:[余志强的博客] 在React Native ...

  10. python 反人类函数式编程模拟while和if控制流

    比如下面这个简单明了的命令式程序,它不断捕捉用户输入的内容,然后对其求和.直到用户输入一个以'0'开头的字符串,停止捕捉. while 1: line = input() ': print(sum(m ...