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[中序转后序][难]的更多相关文章

  1. PAT 1086 Tree Traversals Again

    PAT 1086 Tree Traversals Again 题目: An inorder binary tree traversal can be implemented in a non-recu ...

  2. PAT 甲级 1086 Tree Traversals Again (25分)(先序中序链表建树,求后序)***重点复习

    1086 Tree Traversals Again (25分)   An inorder binary tree traversal can be implemented in a non-recu ...

  3. 1086 Tree Traversals Again——PAT甲级真题

    1086 Tree Traversals Again An inorder binary tree traversal can be implemented in a non-recursive wa ...

  4. 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 ...

  5. PAT 1020. Tree Traversals

    PAT 1020. Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. ...

  6. [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 ...

  7. 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 ...

  8. 【构建二叉树】02根据中序和后序序列构造二叉树【Construct Binary Tree from Inorder and Postorder Traversal】

    我们都知道,已知中序和后序的序列是可以唯一确定一个二叉树的. 初始化时候二叉树为:================== 中序遍历序列,           ======O=========== 后序遍 ...

  9. PAT A1020 Tree Traversals(25)

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

随机推荐

  1. MyBatis常用对象SqlSessionFactory和SqlSession介绍和运用

    学习框架一个比较好的路径阅读源码.本文介绍的SqlSessionFactory和SqlSession.可以通过了解SqlSessionFactory接口和SqlSession接口以及两个的实现类入手, ...

  2. erlang的进程池。

    转自: http://blog.sina.com.cn/s/blog_96b8a1540101542m.html 主要组成部分: https://github.com/devinus/poolboy ...

  3. yii2.0操作数据库

    首先不得不说yii2.0面向对象的比较彻底,建议没学过或者没学好面向对象的同学再看看面向对象. 其次切入正题. 先创建数据库,这步自己写. DROP TABLE IF EXISTS `country` ...

  4. Loadrunner测试实例分析

    LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源.数据库服务器资源等几个方面分析,如图1 ...

  5. django定义app名称

    1.apps.py class AccountConfig(AppConfig): name = 'account' verbose_name = u'用户信息' # app显示中文 2. __ini ...

  6. 权限模块_整体方案说明_设计实体&映射实体_实现初始化权限数据的功能

    权限模块_整体方案说明 要点说明 权限就是控制功能的使用(功能对应着URL). 对功能的控制就是对URL的访问控制. 在我们的程序中,一个功能对应一个或两个URL: 1,例如列表或删除功能,只对应一个 ...

  7. 初始Dubbo

    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...

  8. 五 Android Studio打包Eegret App (包名和签名,打出正式包)

    一 定义包名 如下图,在AndroidManifest.xml中的package就是包名 二 创建keystore 选择Build->Generate Signed APK 选择create n ...

  9. Zabbix监控介绍及安装配置

    什么是zabbix zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵 ...

  10. Java Filter过滤xss注入非法参数的方法

    http://blog.csdn.NET/feng_an_qi/article/details/45666813 Java Filter过滤xss注入非法参数的方法 web.xml: <filt ...