zoukankan      html  css  js  c++  java
  • 03-树3 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 (≤) 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
     #include<cstdio>
     #include<stack>
     #include<cstring>
     using namespace std;
     const int maxn = 35;
     struct Node{
         int data;
        Node* lchild;
        Node* rchild;    
     };
     int n,pre[maxn],in[maxn],num = 0;
     
     Node* createTree(int preL,int preR,int inL,int inR){
         if(preL > preR) return NULL;
         Node* root = new Node;
         root -> data = pre[preL];
         //printf("%d
    ",root->data);
         int k;
         for(k = inL; k <= inR; k++){
             if(in[k] == pre[preL]) break;
         }
         int numLeft = k - inL;
         root->lchild = createTree(preL+1,preL+numLeft,inL,k-1);
         root->rchild = createTree(preL+numLeft+1,preR,k+1,inR);
         return root; 
     }
     
     void postOrder(Node* root){
         if(root == NULL) return;
        postOrder(root->lchild);
        postOrder(root->rchild);
        printf("%d",root->data);
        num++;
        if(num < n) printf(" ");
     }
     
     int main(){
         int x,k1=0,k2=0;
         scanf("%d",&n);
         stack<int> st;
         char str[5];
         for(int i = 0; i < 2*n; i++){
             scanf("%s",str);
             if(strcmp(str,"Push") == 0){
                 scanf("%d",&x);
                 st.push(x);
                 pre[k1++] = x;
             }else{
                 in[k2++] = st.top();
                 st.pop();
             }
         }
        // printf("1
    ");
         Node* root = createTree(0,n-1,0,n-1);
        // printf("2
    ");
         postOrder(root);
         return 0;
     }
  • 相关阅读:
    图论——拓扑排序
    BZOJ 2882 & 后缀数组的傻逼实现
    BZOJ 2626 & KDtree
    Colorado Potato Beetle(CF的某道) & 鬼畜宽搜
    Prime & 反素数plus
    BZOJ 2049 & LCT又一模板
    BZOJ2002 & LCT模板(分块不会搞)
    BZOJ2190 & 欧拉函数
    BZOJ 1053 & 反素数
    POJ2774 & 后缀数组模板题
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/10409358.html
Copyright © 2011-2022 走看看