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 <stdio.h>
#include <stack>

int first[50];
int mid[50];
int n;

int find_mid(int x)
{
    int i;
    for(i=0; i<n; i++)
    {
        if(mid[i]==x) return i;
    }
}

int count_=0;
void print(int l, int r, int l2, int r2) //后序
{
    //printf("%d %d\n",l,r);
    if(l==r){
        ++count_;
        printf("%d",first[l]);
        if(count_==n) printf("\n");
        else printf(" ");
        return ;
    }
    if(l>r) return ;

    int midd=find_mid(first[l]);
    //left
    print(l+1, l+midd-l2, l2, midd-1);
    //right
    print(l+midd-l2+1, r, midd+1, r2);
    //mid
    ++count_;
    printf("%d", first[l]);
    if(count_==n) printf("\n");
    else printf(" ");
}

int main()
{
    int i,j=-1,k=-1;
    char P[100][6];
    std::stack <int> st;
    scanf("%d", &n); getchar();
    for(i=0; i<2*n; i++)
    {
        scanf("%s", &P[i]);
        if(P[i][1]=='u') {
            scanf("%d", &first[++j]);
            getchar();
            st.push(first[j]);
        }
        else {//pop
            getchar();
            mid[++k]=st.top();
            st.pop();
        }
    }
    print(0,n-1,0,n-1);
    return 0;
}

 

posted @ 2020-03-08 20:11  liuyongliu  阅读(242)  评论(0编辑  收藏  举报