美文网首页
MOOC Tree Traversals Again

MOOC Tree Traversals Again

作者: 有苦向瓜诉说 | 来源:发表于2017-03-22 12:03 被阅读0次

    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.
    [图片上传失败...(image-1897-1511628506569)]Figure 1
    Input Specification:
    Each input file contains one test case. For each case, the first line contains a positive integer N

    N

    N (≤
    3
    0

    \le 30

    ≤30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N

    N

    N). Then 2
    N

    2N

    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.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MaxSize 30
    
    struct{
        int top;
        int data[MaxSize]; 
    }stack;
    
    int preorder[MaxSize],inorder[MaxSize];
    void GetPostOrder(int preorder[],int a,int b,int inorder[],int c,int d)
    {
        int i;
        for( i=c;i<=d&&preorder[a]!=inorder[i];i++);
        if(i>0) GetPostOrder(preorder,a+1,i,inorder,c,i-1);
        if(i<d) GetPostOrder(preorder,i+1,b,inorder,i+1,d);
        printf("%d ",inorder[i]);
    }
    int main()
    {
        freopen("in.txt","r",stdin);
        stack.top=-1;
        int n,pretop=0,intop=0,temp;
        scanf("%d",&n);
        for(int i=0;i<2*n;i++)
        {
            char s[5];
            scanf("%s",s);
            if(strcmp(s,"Push")==0){
                scanf("%d",&temp);
                stack.data[++stack.top]=temp;
                preorder[pretop++]=temp;
            }
            else{
                inorder[intop++]=stack.data[stack.top--];
            }
        }
        GetPostOrder(preorder,0,n-1,inorder,0,n-1);
    }

    相关文章

      网友评论

          本文标题:MOOC Tree Traversals Again

          本文链接:https://www.haomeiwen.com/subject/twhonttx.html