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. 011杰信-创建购销合同Excel报表系列-4-建立合同货物(修改,删除):合同货物表是购销合同表的子表

    前面的一篇文章做的是修改删除,这篇文章做的是合同货物的修改和删除. 业务功能如下:

  2. ubuntu被delete的文件位置

    在-/.local/share/Trash/files下边 可以通过 cd / find -name <filename> 找到盖文件的位置

  3. Oracle Data Provider for .NET的使用(三)-ORACLE与.NET类型对应关系

    想来这个是最重要的事情了,因为多数情况下,我们使用dbhelper来调用数据库的时候,是因为如下三个地方导致错误: 1.错误的sql语句:末尾多了分号,少了部分关键字 2.sql中的参数与parame ...

  4. UNIQLO

    UNIQLO品牌的迅销公司建立于1963年,当年是一家销售西服的小服装店.公司现任董事长兼总经理柳井正早年毕业于早稻田大学经济学专业,1972年8月进入迅销公司,1984年9月就任公司董事长兼总经理. ...

  5. 织梦dedecms整合discuz论坛的操作方法

    织梦dedecms和discuz论坛整合主要用途,是让两个系统共享用户数据,同一个用户可以在两个网站都可以登录.在我们制作织梦cms模板的时候,有时需要整合discuz里的东细.本文主要讲解一下ded ...

  6. iOS 模块化

    模块化 1.公共模块 网络层 模型层(基类) 2.mvvm 3.模块化(单元模块,实现单元功能,单元测试) 4.pod 5.路由

  7. CPU GPU设计工作原理《转》

    我知道这非常长,可是,我坚持看完了.希望有幸看到这文章并对图形方面有兴趣的朋友,也能坚持看完.一定大有收获.毕竟知道它们究竟是怎么"私下勾搭"的.会有利于我们用程序来指挥它们... ...

  8. WPF进阶之接口(2):IDisposable,ICollectionView

    废话不多说,进入正题,先来说说IDisposable,看例子(来自MSDN): using System; using System.ComponentModel; // 下面的例子将展示一个实施了I ...

  9. Git 安装与使用

    http://blog.csdn.net/lishuo_os_ds/article/details/8078475#sec-1.8.2 http://blog.csdn.net/showhilllee ...

  10. 【黑金原创教程】【Modelsim】【第六章】结束就是开始

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...