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

题目分析

已知非递归中序(借助栈)遍历树的操作流程,求后序序列
注:操作流程中push操作依次组成前序序列,又可以借助push和pop操作得到中序序列,题目即转换为中序+前序->后序

解题思路

思路 01

  1. 中序+前序建树
  2. 递归后序遍历树

思路 02(最优)

  1. 中序+前序直接转后序序列

知识点

  1. while(~scanf("%s",s)) {} //等价于scanf("%s",s)!=EOF

    两者作用是相同的
    ~是按位取反
    scanf的返回值是输入值的个数
    如果没有输入值就是返回-1
    -1按位取反结果是0
    while(~scanf("%d", &n))就是当没有输入的时候退出循环
    EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。
    EOF 的值通常为 -1

Code

Code 01

#include <iostream>
#include <vector>
#include <stack>
using namespace std;
vector<int> pre,in;
int index,n;
struct node {
    int data;
    node * left;
    node * right;
};
node * create(int preL,int preR,int inL,int inR) {
    if(preL>preR)return NULL;
    node * now = new node;
    now->data=pre[preL];
    int k=inL;
    while(k<inR&&in[k]!=pre[preL])k++;
    now->left=create(preL+1, preL+(k-inL), inL, k-1);
    now->right=create(preL+(k-inL)+1, preR, k+1, inR);
    return now;
}
void postOrder(node * root) {
    if(root==NULL)return;
    postOrder(root->left);
    postOrder(root->right);
    printf("%d",root->data);
    if(++index<n)printf(" ");
}
int main(int argc,char * argv[]) {
    int id;
    string s;
    stack<int> sc;
    scanf("%d",&n);
    int len=n<<1;
    for(int i=0; i<len; i++) {
        cin>>s;
        if(s=="Push") {
            scanf("%d",&id);
            pre.push_back(id);//preorder
            sc.push(id);
        }
        if(s=="Pop") {
            in.push_back(sc.top());
            sc.pop();
        }
    }
    node * root = create(0,n-1,0,n-1);
    postOrder(root);
    return 0;
}

Code 02(最优)

#include <iostream>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;
vector<int> pre,in,post;
int n;
void postOrder(int preL,int preR,int inL,int inR){
    if(inL>inR)return;// preL>preR也可以
    int k=inL;
    while(k<inR&&in[k]!=pre[preL])k++;
    postOrder(preL+1, preL+(k-inL), inL, k-1);//先存放左子节点
    postOrder(preL+(k-inL)+1, preR, k+1, inR);//后存放右子节点
    post.push_back(pre[preL]); //再存放父节点
}
int main(int argc,char * argv[]) {
    int id;
    char s[5];
    stack<int> sc;
    scanf("%d",&n);
    while(~scanf("%s",s)) { //等价于scanf("%s",s)!=EOF
        if(strlen(s)==4) {
            //Push
            scanf("%d",&id);
            pre.push_back(id);
            sc.push(id);
        } else {
            //Pop
            in.push_back(sc.top());
            sc.pop();
        }
    }
    postOrder(0,n-1,0,n-1);
    for(int i=0;i<post.size();i++){
        printf("%d",post[i]);
        if(i!=post.size()-1)printf(" ");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/houzm/p/12327575.html

时间: 2024-10-27 17:19:23

PAT Advanced 1086 Tree Traversals Again (25) [树的遍历]的相关文章

PAT Advanced 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()

PAT:1086. Tree Traversals Again (25) AC

#include<stdio.h> #include<string.h> #include<stack> using namespace std; const int MAX=50; int n,cnt=0; //n个节点,cnt在后序输出的时候控制空格数量用 int PRE[MAX],IN[MAX]; //先序,中序 int preI,inI; //先序,中序的下标 stack<int> S; //栈 struct node { int data; nod

1086. Tree Traversals Again (25)【二叉树】——PAT (Advanced Level) Practise

题目信息 1086. Tree Traversals Again (25) 时间限制200 ms 内存限制65536 kB 代码长度限制16000 B 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

PAT Advanced 1020 Tree Traversals (25分)

1020 Tree Traversals (25分) Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

PAT (Advanced Level) 1086. Tree Traversals Again (25)

入栈顺序为先序遍历,出栈顺序为中序遍历. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<stack> using namespace std; const int maxn=1000+10; const int INF=0x7FFFFFFF; int n,tot; int Preorder[maxn],Inorder[maxn],Po

PAT 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()

1086. Tree Traversals Again (25)

时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue push 的顺序就是二叉树的前序 pop的顺序就是二叉树的中序遍历 本质上还是考根据这两个顺序建立二叉树,并且进行后序遍历 An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when

PAT 甲级 1086 Tree Traversals Again

https://pintia.cn/problem-sets/994805342720868352/problems/994805380754817024 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

pat1086. Tree Traversals Again (25)

1086. Tree Traversals Again (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue 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 th