PAT 1086 Tree Traversals Again[中序转后序][难]
1086 Tree Traversals Again(25 分)
An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(); push(4); pop(); pop(); push(5); push(6); pop(); pop(). Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations. Your task is to give the postorder traversal sequence of this tree.
Figure 1
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (≤30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2N lines follow, each describes a stack operation in the format: "Push X" where X is the index of the node being pushed onto the stack; or "Pop" meaning to pop one node from the stack.
Output Specification:
For each test case, print the postorder traversal sequence of the corresponding tree in one line. A solution is guaranteed to exist. All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
6
Push 1
Push 2
Push 3
Pop
Pop
Push 4
Pop
Pop
Push 5
Push 6
Pop
Pop
Sample Output:
3 4 2 6 5 1
题目大意:二叉树的中根遍历,可以通过栈来实现,那么现在给出一棵二叉树的中根遍历操作,要求输出后根遍历结果。
//完全可以通过输入来确定这棵二叉树的中根遍历,即已知中根遍历求后根遍历。但是我不会啊。
代码转自:https://www.liuchuo.net/archives/2168
#include <cstdio>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;
vector<int> pre, in, post,value;
void postorder(int root, int start, int end) {
if (start > end) return;
int i = start;
while (i < end && in[i] != pre[root]) {//中序遍历序列中存的节点的id,唯一的!
i++;
printf("%d %d\n" ,in[i],pre[root]);
}
postorder(root + , start, i - );
//左子树共有i-start+1个节点。
postorder(root + + i - start, i + , end);
post.push_back(pre[root]);
}
int main() {
int n;
scanf("%d", &n);
char str[];
stack<int> s;
int key=;
while (~scanf("%s", str)) {
if (strlen(str) == ) {
int num;
scanf("%d", &num);
value.push_back(num);
pre.push_back(key);//对应num有一个序号,从0开始。 s.push(key++);
} else {
in.push_back(s.top());//现在存了中序遍历
//存的是id对应的序号(为了防止重复呢。)
s.pop();
}
} postorder(, , n - );
printf("\n");
printf("%d", value[post[]]);
for (int i = ; i < n; i++)
printf(" %d",value[post[i]]);
return ;
}
//这个代码简直太难了,看了好几遍都理解不了那个中序转后序的,气死了。
//这个明天还要搜一下别的题解,简直气死我了。
//更要重点掌握一套,二叉树的各种访问序列转换方法。
2018-11-17更——————
我的AC:
#include <iostream>
#include <cstdio>
#include <vector>
#include<stack> using namespace std;
vector<int> in,pre,post;
void postOrder(int inL,int inR,int preL,int preR){
if(inL>inR)return ;
// int i=0;//标识中根遍历中的根节点下标
int i=;
while(in[i]!=pre[preL])i++;
//遍历左右子树
postOrder(inL,i-,preL+,preR+i-inL);
postOrder(i+,inR,preL+i-inL+,preR);
post.push_back(in[i]);
}
int main()
{
//push的顺序就是前序,弹出的顺序就是中序。
int n,id;
cin>>n;
string s;
stack<int> tree;
for(int i=;i<*n;i++){
cin>>s;
if(s[]=='u'){
cin>>id;
tree.push(id);
pre.push_back(id);//前序遍历放进来。
}else{
int temp=tree.top();
tree.pop();
in.push_back(temp);
}
}
// cout<<pre.size();
postOrder(,n-,,n-);
for(int i=;i<n;i++){
cout<<post[i];
if(i!=n-)cout<<" ";
}
return ;
}
//在牛客网上通不过,说内存超限,通过率为0,因为递归层数太深?
遇到的问题:
1.postOrder函数,作为递归出口应该是in的左右去判断,如果是pre的,则不会输出结果
2.在postOrder的while循环中,i可以从0开始判断。
3.柳神的代码考虑了key不唯一的情况,但是我没考虑,而且PAT上应该也没考虑,否则就不会AC了。
4.关于这个key的问题,是应该考虑一下不唯一的情况的,因为题目里并没有说。
PAT 1086 Tree Traversals Again[中序转后序][难]的更多相关文章
- PAT 1086 Tree Traversals Again
PAT 1086 Tree Traversals Again 题目: An inorder binary tree traversal can be implemented in a non-recu ...
- PAT 甲级 1086 Tree Traversals Again (25分)(先序中序链表建树,求后序)***重点复习
1086 Tree Traversals Again (25分) An inorder binary tree traversal can be implemented in a non-recu ...
- 1086 Tree Traversals Again——PAT甲级真题
1086 Tree Traversals Again An inorder binary tree traversal can be implemented in a non-recursive wa ...
- PAT Advanced 1086 Tree Traversals Again (25) [树的遍历]
题目 An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For exam ...
- PAT 1020. Tree Traversals
PAT 1020. Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. ...
- [LeetCode] Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树
Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume tha ...
- LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树 C++
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- 【构建二叉树】02根据中序和后序序列构造二叉树【Construct Binary Tree from Inorder and Postorder Traversal】
我们都知道,已知中序和后序的序列是可以唯一确定一个二叉树的. 初始化时候二叉树为:================== 中序遍历序列, ======O=========== 后序遍 ...
- PAT A1020 Tree Traversals(25)
题目描述 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder ...
随机推荐
- 在项目中使用JMail发送邮件
1.添加JMail组件:在vs的解决方案资源管理器中,右键添加引用,选择浏览,选择jmail.dll文件,在Bin文件夹中就可以看到添加的JMail组件. 2.注册JMail组件:开始-->运行 ...
- 【BZOJ】1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(暴力dfs+set判重)
http://www.lydsy.com/JudgeOnline/problem.php?id=1675 一开始我写了个枚举7个点....... 但是貌似... 写挫了. 然后我就写dfs.. 判重好 ...
- 转:Socket服务器整体架构概述
Socket服务器主要用于提供高效.稳定的数据处理.消息转发等服务,它直接决定了前台应用程序的性能.我们先从整体上认识一下Socket服务器,Socket服务器从架构上一般分为:网络层.业务逻辑层.会 ...
- MathType怎么编辑双箭头
很多的数学相关工作者在写文章或论文的时候常常会用到数学公式编辑器.MathType就是一款深受大家欢迎的公式编辑器.很多的用户在使用过程中会用到双箭头符号来表示推理过程,但是怎么编辑又不知道,下面本教 ...
- React Native开发技术
http://www.lcode.org/react-native-week-issue22/
- Object和Function谁先被创建
http://bbs.csdn.net/topics/390772104#post-397284029
- WPF 纯代码生成界面(不使用XAML)
对于编写 WPF 应用程序,只是用代码进行开发而不使用任何 XAML 不是常见的方式(但是仍然完全支持).只使用代码进行开发的明显缺点是,有可能会使用编写 WPF 应用程序成为极端乏味的工作. WPF ...
- 编程之美 set 9 字符串移位包含问题
题目 给定字符串 s1 和 s2, 要求判定 s2能否能够被通过 s1 做循环移位得到的字符包含. s1 = AABCD, s2 = CDAA 返回 true. 给定 s1 = ABCD 和 s2 = ...
- Java线程之CompletionService批处理任务
如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果,怎么办呢? 为此你可以保存与每个任务相关联的Future,然后不断地调用 timeout为零的get,来检验Future是否 ...
- Arduino开发版学习计划
制定学习开发版的计划,今天先大体过一下整个教程. http://www.bilibili.com/video/av6105302/ 视频中说可以自己制造亦可卫星放上天. Arduino使用C/C++编 ...