• Tree Traversals Again


    题目: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

    题意:

    大概就是用push、pop创建一个二叉树,(先序与中序),然后用后序输出。

    咋做:

    刚开始用的是结构体数组来做,我丢,调试了一整天一直都是那个测试点没过  ><  ,然后听别人说输入的节点的值数值可能相等,我丢..........

    后来改成了链式结构,然后有个小地方注意一下就A了。

    代码:

    #include <string>
    #include <map>
    #include <cmath>
    #include <limits>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <stack>
    #include <queue>
    #define Sci(x) scanf("%d",&x)
    #define Sci2(x, y) scanf("%d%d",&x,&y)
    #define Sci3(x, y, z) scanf("%d%d%d",&x,&y,&z)
    #define Scl(x) scanf("%I64d",&x)
    #define Scl2(x, y) scanf("%I64d%I64d",&x,&y)
    #define Scl3(x, y, z) scanf("%I64d%I64d%I64d",&x,&y,&z)
    #define Pri(x) printf("%d
    ",x)
    #define Prl(x) printf("%I64d
    ",x)
    #define For(i,x,y) for(int i=x;i<y;i++)
    #define FFor(i,x,y) for(int i=x;i>y;i--)
    #define For_(i,x,y) for(int i=x;i<=y;i++)
    #define FFor_(i,x,y) for(int i=x;i>=y;i--)
    #define Mem(f, x) memset(f,x,sizeof(f))
    #define LL long long
    #define ULL unsigned long long
    #define MAXSIZE 30
    #define INF 0x3f3f3f3f
    const int mod = 1e9+7;
    const double PI = acos(-1.0);
    
    using namespace std;
    typedef struct node
    {
        struct node *left;
        struct node *right;
        int data;
    } Tree,*Ptr;
    Ptr init(int a)
    {
        Ptr t;
        t=new Tree;
        t->left=t->right=NULL;
        t->data=a;
        return t;
    }
    int flag=1;
    void putt(Ptr t)
    {
        if(t!=NULL)
        {
            putt(t->left);
            putt(t->right);
            if(flag)
                printf("%d",t->data);
            else
                printf(" %d",t->data);
            flag=0;
        }
    }
    int main()
    {
        int n;
        Sci(n);
        Ptr T,p;
        T=new Tree;
        T->left=T->right=NULL;
        p=T;
        int a;
        stack<Ptr>s;
        char str[6];
        s.push(T);
        while(~scanf("%s",str))
        {
            if(strcmp(str,"Push")==0)
            {
                scanf("%d",&a);
                if(p->left==NULL)
                {
                    p->left=init(a);
                    s.push(p->left);
                    p=p->left;
                }
                else if(p->right==NULL)
                {
                    p->right=init(a);
                    s.push(p->right);
                    p=p->right;
                }
            }
            else
            {
                p=s.top();
                s.pop();
            }
        }
        putt(T->left);//此处传递的是根的左结点???上面的while循环里最开始入栈的是根的左结点,在题目输入时把这个结点当作根节点来使用,所以  T->left. QAQ
        return 0;
    }
    View Code
  • 相关阅读:
    webpack4笔录
    在Salesforce中进行Report和Dashboard的配置
    在Salesforce中以PDF的格式显示对应的页面
    在Salesforce中处理Email的发送
    在Visualforce page中用自带的控件实现Ajax回调后台方法(并且可以用js去动态给parameters赋值)
    javascript settimeout and setinterval
    Convert XML to Object using LINQ
    Convert Object to XML using LINQ
    JS对Array进行自定制排序
    在Salesforce中通过 Debug Log 方式 跟踪逻辑流程
  • 原文地址:https://www.cnblogs.com/hbhdhd/p/11284790.html
Copyright © 2020-2023  润新知