1086 Tree Traversals Again
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 (≤) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2 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
题意:
采用非递归的方式来确定一颗二叉树,然后将这颗二叉树按照后序遍历的方式来输出。
思路:
这道题用到的理论知识就是通过一棵二叉树的先序遍历和中序遍历来构建这棵树,当然前提是你能够看出来进栈的序列是先序遍历的结果,出栈的序列是中序遍历的结果。构建树的代码(递归):
Node CreateTree(int left, int right){
if(left > right) return NULL;
int root = preOrder[cur];
cur++;
int rootIndex = findRootIndex(root);
Node T = new TreeNode();
T->num = root;
if(left != right){
T->left = CreateTree(left,rootIndex-1);
T->right = CreateTree(rootIndex+1,right);
}
return T;
}
Code:
#include<iostream>
#include<queue>
#include<stack> using namespace std; typedef struct Node *node;
struct Node {
int value;
node leftSon;
node rightSon;
node father;
Node():value(), leftSon(), rightSon(), father(){}
}; void postOrder(node h) {
if (h != NULL) {
postOrder(h->leftSon);
postOrder(h->rightSon);
cout << h->value << " ";
}
} int main() {
int n;
cin >> n;
getchar();
string str, op, num;
int pos;
queue<string> q;
stack<int> s;
stack<string> leftOrRight;
for (int i = 0; i < n*2; ++i) {
getline(cin, str);
if (str[1] == 'u') {
pos = str.find(' ');
op = str.substr(0, pos);
num = str.substr(pos+1);
q.push(op);
q.push(num);
} else {
q.push(str);
}
} node head = new Node();
node prt = head;
while (!q.empty()) {
if (q.front() == "Push") {
q.pop();
int value = stoi(q.front());
s.push(value);
q.pop();
node temp = new Node();
if (prt->leftSon) {
leftOrRight.push("right");
prt->rightSon = temp;
temp->father = prt;
} else {
leftOrRight.push("left");
prt->leftSon = temp;
temp->father = prt;
}
prt = temp;
} else {
q.pop();
if (leftOrRight.top() == "left") prt = prt->father;
prt->value = s.top();
if (leftOrRight.top() == "right") prt = prt->father;
s.pop();
leftOrRight.pop();
}
}
postOrder(prt);
return 0;
}
以上是我写的代码,因为没有注意到题目中暗含着两种遍历,所以写的代码也很乱,当然也是错误的。
以下的代码来自:https://blog.csdn.net/xyt8023y/article/details/47443489
#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
#include <sstream>
#include <stack> using namespace std; int N,cur;
vector<int> preOrder;
vector<int> inOrder; typedef struct TreeNode *Node;
struct TreeNode{
int num;
Node left,right; TreeNode(){
left = NULL;
right = NULL;
} }; int findRootIndex(int rootNum){ for(int i = 0;i < N; i++){
if(inOrder[i] == rootNum){
return i;
}
}
return -1; } Node CreateTree(int left, int right){
if(left > right) return NULL;
int root = preOrder[cur];
cur++;
int rootIndex = findRootIndex(root);
Node T = new TreeNode();
T->num = root;
if(left != right){
T->left = CreateTree(left,rootIndex-1);
T->right = CreateTree(rootIndex+1,right);
}
return T;
} bool firstOutPut = true;
void PostOrder(Node T){
if(!T) return;
PostOrder(T->left);
PostOrder(T->right);
if(firstOutPut){
printf("%d",T->num);
firstOutPut = false;
}else{
printf(" %d",T->num);
}
} int main()
{
stringstream ss;
string Nstr;
getline(cin,Nstr);
ss << Nstr;
ss >> N;
ss.clear();
string input;
stack<int> stk;
int value;
for(int i = 0; i < N * 2; i++){
getline(cin,input);
if(input[1] == 'u'){
string num = input.substr(5);
ss << num;
ss >> value;
ss.clear();
stk.push(value);
preOrder.push_back(value);
}else{
value = stk.top();
stk.pop();
inOrder.push_back(value);
}
}
Node T = CreateTree(0,N-1);
PostOrder(T);
return 0;
}
值得注意的是cur并没有赋初值,测试发现他的初值默认为0.
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[中序转后序][难]
1086 Tree Traversals Again(25 分) An inorder binary tree traversal can be implemented in a non-recurs ...
- 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 ...
- 1086. Tree Traversals Again (25)
题目如下: An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For e ...
- PAT 甲级 1086 Tree Traversals Again
https://pintia.cn/problem-sets/994805342720868352/problems/994805380754817024 An inorder binary tree ...
- 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 ...
- 1086. Tree Traversals Again (25)-树的遍历
题意:用栈的push.pop操作给出一棵二叉树的中序遍历顺序,求这棵二叉树的后序遍历. 需要一个堆结构s,一个child变量(表示该节点是其父亲节点的左孩子还是右孩子),父亲节点fa对于push v操 ...
- 1086 Tree Traversals Again (25 分)(二叉树的遍历)
用栈来模拟一棵二叉树的先序遍历和中序遍历过程,求这棵二叉树的后序遍历 由题棵知道:push是先序遍历 pop是中序遍历 #include<bits/stdc++.h> using name ...
随机推荐
- Hive 填坑指南
Hive 填坑指南 目录 Hive 填坑指南 数据表备份 数据表备份 方法1:create table 表名_new as select * from 原表 create table 表名_new a ...
- NodeJs 入门到放弃 — 常用模块及网络爬虫(二)
码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14473101.html 目录 码文不易啊,转载请带上本文链接呀,感谢感谢 https ...
- Hi3559板载u-boot、kernel及rootfs烧录过程及心得
这一篇随笔讲叙述下基于Hi3559AV100的BOXER-8410AI板载u-boot.kernel及rootfs烧录具体过程及遇到问题的解决方法与心得. 1.前期板载启动测试和烧录手段 1.1.烧写 ...
- 剑指 Offer 59 - I. 滑动窗口的最大值 + 双指针 + 双端队列
剑指 Offer 59 - I. 滑动窗口的最大值 Offer_59_1 题目详情 方法一:暴力方法+双指针 package com.walegarrett.offer; /** * @Author ...
- 泛微OA 多版本存在命令执行
参考 https://blog.csdn.net/qq_41770175/article/details/102821349 https://www.linktrust.net/oday/471.ht ...
- imagemagick 之 Fred's ImageMagick Scripts 在Ubuntu 下的实践
Fred's ImageMagick Scripts 官网:http://www.fmwconcepts.com/imagemagick/index.php Windows 10 (64-bit) u ...
- c++反汇编 switch
switch 线性处理 24: int nIndex = 0; 01377EBE C7 45 F8 00 00 00 00 mov dword ptr [nIndex],0 25: scanf(&qu ...
- pwnable.kr第二题collision
1 col@prowl:~$ ls -al 2 total 36 3 drwxr-x--- 5 root col 4096 Oct 23 2016 . 4 drwxr-xr-x 114 root ro ...
- linux screen的用法
今天使用vps时,起了一个http服务,因为需要用nc接收流量,就要关闭http服务,再去用nc接收流量就接收不到,请教了师傅,这里需要用到screen创建一个会话,就能http服务跟nc同时进行. ...
- Istio安全-证书管理(实操一)
Istio安全-证书管理 目录 Istio安全-证书管理 插入现有CA证书 插入现有证书和密钥 部署Istio 配置示例services 校验证书 卸载 Istio的DNS证书管理 DNS证书的提供和 ...