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 ...
随机推荐
- Android Studio 工具栏添加图标
本文中 Android Studio 的版本为 Android Studio 2.2 ,操作系统为 Windows,如有操作不同,可能是版本差异.在工具栏中添加一些常用的图标有利于我们开发,举例说明: ...
- Spring Cloud体系介绍
上图只是Spring Cloud体系的一部分,Spring Cloud共集成了19个子项目,里面都包含一个或者多个第三方的组件或者框架! Spring Cloud 工具框架 1.Spring Clou ...
- 【BZOJ】2555: SubString(后缀自动机)
http://www.lydsy.com/JudgeOnline/problem.php?id=2555 学到了如何快速维护right值orz (不过这仍然是暴力维护,可以卡到O(n) 首先我们在加一 ...
- hdu 1392:Surround the Trees(计算几何,求凸包周长)
Surround the Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- [转]Tcpcopy简介与实战
Tcpcopy简介 TCPCopy是一种请求复制(所有基于tcp的packets)工具 ,其功能是复制在线数据包,修改TCP/IP头部信息,发送给测试服务器,达到欺骗测试服务器的TCP 程序的目的,从 ...
- 修改Android 界面颜色
btnGetCode.setTextColor(getResources().getColor(R.color.dark_white)); Color.parseColor("#1a71d4 ...
- C++之强制类型转换
C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
- 【翻译】Webpack 4 从0配置到生产模式
查看原文 webpack 4 发布了! webpack 4 作为一个零配置的模块打包器 webpack 是强大的并且有许多独一无二的特点但是有一个痛点就是配置文件. 在中型到大型项目中为webpack ...
- C语言跳出循环
使用while或for循环时,如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用break或continue关键字. break关键字 在<C语言switch语句>一节中,我 ...
- Arduino开发版学习计划--直流电机
代码来源:http://www.cnblogs.com/starsnow/p/4579547.html // --------------------------------------------- ...