• 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


    解析:先建树,在后后序遍历
    push的顺序就是先序遍历的顺序
    pop的顺序就是中序的顺序
    #include<iostream>
    #include<stack>
    #include<string>
    
    using namespace std;
    
    
     int pre[40],in[40],post[40];//以此为先序,中序,后序的输入序列
    int n;
       stack<int> st;//
     struct node
     {
         int data;
         node* left;
         node*  right;
     };
    
     node* create(int prel, int prer, int inl, int inr)//通过先序,中序建树
     {
         if(prel>prer)
            return NULL;
         node* root = new node;
         root ->data  = pre[prel];
         int k=0;
         for(k = inl;k<=inr;k++)
         {
             if(in[k]==pre[prel])
                break;
         }
         //k指示了中序遍历的根节点的位置
         int numleft = k - inl;
    
         root ->left = create(prel+1,prel+numleft,inl,k-1);
         root->right = create(prel+numleft+1,prer,k+1,inr);
    
         return root;
    
     }
     int num=0;
    void postorder(node* root)//后序遍历
    {
        if(root == NULL)
            return;
        postorder(root->left);
        postorder(root->right);
        printf("%d",root->data);
        num++;
    
        if(num<n)
            printf(" ");
    }
    int main()
    {
       scanf("%d",&n);
       string str;
    
    
    
       int x, preindex=0, inindex=0;
       for(int i=0;i<2*n;i++)
       {
           cin>>str;
           if(!str.compare("Push"))//如果str和push相等,s.compare("Push")返回0       {
               scanf("%d",&x);
               pre[preindex++] = x;//输入先序遍历
                st.push(x);
           }
           else
           {
               int temp = st.top();
               st.pop();
               in[inindex++] = temp;//中序遍历
           }
       }
    
       node* root = create(0,n-1,0,n-1);
       postorder(root);
    
       return 0;
    
    }
  • 相关阅读:
    linux下给U盘分区&制作文件系统
    迭代器 配接器
    仿函数
    在查询用户的权限的时候 使用左外连接 和 access数据库中左外连接
    C# 想要程序文件移动 而数据保持相对位置
    C# 第三方控件 下面的Item不显示了
    C# 第三方控件 错误 LC-1
    c# 第三方控件 闪退
    access 语句错误
    poj 1469(二分图 最大匹配)
  • 原文地址:https://www.cnblogs.com/qinmin/p/12868261.html
Copyright © 2020-2023  润新知