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. 阿里云ecs开启x11图形化桌面

    阿里云帮助文档:https://www.alibabacloud.com/help/zh/faq-detail/41227.htm 安装云服务器 ECS CentOS 7 图形化桌面 以安装 MATE ...

  2. servlet和jsp中间的交互

    jsp本质上也是一个servlet, 所有的jsp页面最终会编译成一个servlet 1. jsp访问servlet jsp访问servlet比较简单通过get, post的方式直接访问servlet ...

  3. 如何通过Keil将程序正确的下载进flash中

    前面介绍了一些创建工程和调试的基本步骤,在这里准备介绍一下如何正确的将Keil程序在仿真调试中下载到flash.这里再次涉及到了debug的窗口.   工具/原料   Keil uVision 4/5 ...

  4. 如何优化JAVA代码及提高执行效率

    可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率.本文讨论的主要是如何提高代 ...

  5. 【BZOJ1495】[NOI2006]网络收费 暴力+DP

    [BZOJ1495][NOI2006]网络收费 Description 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而,不可忽视的一点就是网络本身有 ...

  6. Centos6.5升级openssh至7.4版本

    一,备份配置文件,以备升级失败进行回退 二,下载安装包 wget http://www.zlib.net/zlib-1.2.11.tar.gz wget https://openbsd.mirror. ...

  7. Rsync文件同步机备份工具使用

    一,Rsync简介 Rsync是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步的优秀工具.适用于多种操作平台. 全称是Remote synchronization 具有可使本地和远 ...

  8. sublimeText前端必备插件

    安装完成后的sublime text,功能单纯地就像笔记本,然而,可以下载对应的插件,使得sublime text不仅仅局限于某一单一语言的编写,此处只提及到前端方面的使用,下面是前端一般使用到的插件 ...

  9. CXF整合Spring之JaxWsProxyFactoryBean调用

    1.见解 1.1 客户端的接口代码还一定要和服务端的接口代码一样,连注解都要一样,不够灵活 1.2 当客户端访问服务器的请求地址时,如果服务端没有对应的地址,就会报错,但是又没有cxf的异常捕获处理 ...

  10. Docker与virtualenv

    docker环境统一,组件隔离 关于Docker与virtualenv,其本质是一样的,virtualenv虚拟python运行环境,保证系统python环境的整洁,docker也是一样,只是它虚拟的 ...