1020. Tree Traversals (25) -BFS
题目如下:
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的更多相关文章
- PAT 甲级 1020 Tree Traversals (25 分)(二叉树已知后序和中序建树求层序)
1020 Tree Traversals (25 分) Suppose that all the keys in a binary tree are distinct positive integ ...
- 【PAT】1020 Tree Traversals (25)(25 分)
1020 Tree Traversals (25)(25 分) Suppose that all the keys in a binary tree are distinct positive int ...
- PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习
1020 Tree Traversals (25分) Suppose that all the keys in a binary tree are distinct positive intege ...
- PAT Advanced 1020 Tree Traversals (25 分)
1020 Tree Traversals (25 分) Suppose that all the keys in a binary tree are distinct positive integ ...
- 1020. Tree Traversals (25)
the problem is from pat,which website is http://pat.zju.edu.cn/contests/pat-a-practise/1020 and the ...
- 【PAT甲级】1020 Tree Traversals (25 分)(树知二求一)
题意: 输入一个正整数N(N<=30),给出一棵二叉树的后序遍历和中序遍历,输出它的层次遍历. trick: 当30个点构成一条单链时,如代码开头处的数据,大约1e9左右的结点编号大小,故采用结 ...
- PAT Advanced 1020 Tree Traversals (25) [⼆叉树的遍历,后序中序转层序]
题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder an ...
- 【PAT】1020. Tree Traversals (25)
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...
- PAT (Advanced Level) 1020. Tree Traversals (25)
递归建树,然后BFS一下 #include<iostream> #include<cstring> #include<cmath> #include<algo ...
随机推荐
- sql统计总和和各状态数
统计状态数目 SELECT arch.dept_id ,dept.dept_name,COUNT(*) AS arch_sum, END) in_stock, END) on_loan, END) i ...
- avalon加载一闪而过现象
为了避免未经处理的原始模板内容在页面载入时在页面中一闪而过,我们可以使用以下样式(详见这里): .ms-controller,.ms-important,[ms-controller],[ms-i ...
- React .js框架的环境搭建
React学习笔记(一)- 环境搭建 最近在学习react相关的知识,刚刚起步,一路遇坑不断.自己做个笔记,方便日后总结,也供相同趣味的小伙伴一起交流探讨. 学习时主要参考官网的教程:https: ...
- 移动端meta标签缓存设置
1.<meta charset="utf-8"> 2.<meta content="width=device-width, initial-scale= ...
- C#利用Attribute实现简易AOP介绍
首先看一段简单的代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } //来自UI层的调用 ...
- Python中and(逻辑与)计算法则
在程序设计中,and称为逻辑与运算,也称布尔运算:1.and是在布尔上下文中从左到右计算表达式的值:2.0.''.[].().{}.None.False在布尔上下文中为假:其它任何东西都为真:3.如果 ...
- PHP Switch 语句
PHP Switch 语句 switch 语句用于根据多个不同条件执行不同动作. PHP Switch 语句 如果您希望有选择地执行若干代码块之一,请使用 switch 语句. 语法 switch ( ...
- 论文答辩ppt要怎么写
1.总体原则: 字大.字少.图多.要有重点 字体建议:正文要用黑体(如微软雅黑),标题可使用宋体或者黑体(如微软雅黑) 2. 主要分为两大部分: 2.1系统介绍 系统概述:概述自己系统主要是做了些什么 ...
- springMVC源码分析--ViewResolver视图解析器(一)
SpringMVC用于处理视图最重要的两个接口是ViewResolver和View.ViewResolver的主要作用是把一个逻辑上的视图名称解析为一个真正的视图,SpringMVC中用于把View对 ...
- OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防
先来看几个出现安全问题的例子 OWASP TOP10 开发为什么要知道OWASP TOP10 TOP1-注入 TOP1-注入的示例 TOP1-注入的防范 TOP1-使用ESAPI(https://gi ...