PAT(A) - 1086. Tree Traversals Again (25)

22 篇文章 0 订阅


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 (<=30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 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.

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

#define MAX 31

using namespace std;

typedef struct {
    int index;
    int lchild;
    int rchild;
} Node;

Node node[MAX];
int count = 0;

void dfsPostOrder( int CurRoot ) {
    if( node[CurRoot].lchild != -1 ) {
        dfsPostOrder( node[CurRoot].lchild );
    }
    if( node[CurRoot].rchild != -1 ) {
        dfsPostOrder( node[CurRoot].rchild );
    }
    if( count == 0 ) {
        printf( "%d", CurRoot );
        count = 1;
    }
    else {
        printf( " %d", CurRoot );
    }

}

int main() {
    //freopen( "123.txt", "r", stdin );
    int n;
    scanf( "%d", &n );

    // 初始化所有结点
    for( int i = 1; i <= n; i++ ) {
        node[i].index = i;
        node[i].lchild = -1;
        node[i].rchild = -1;
    }

    int root = -1;
    char str[5];
    int curNode;
    int preNode;
    stack<Node> s;
    for( int i = 1; i <= 2 * n; i++ ) {
        scanf( "%s", str );
        if( !strcmp( str, "Push" ) ) {
            scanf( "%d", &curNode );
            if( root == -1 ) {
                root = curNode;
                //printf( "root node is %d\n", root );
                s.push( node[curNode] );
                //printf( "%d push stack\n", root );
                preNode = curNode;
                continue;
            }
            if( node[preNode].lchild == -1 ) {
                node[preNode].lchild = curNode;
            }
            else if( node[preNode].rchild == -1 ) {
                node[preNode].rchild = curNode;
            }
            s.push( node[curNode] );
            preNode = curNode;
            //printf( "%d push stack\n", curNode );
        }
        else if( !strcmp( str, "Pop" ) ) {
            Node topNode = s.top();
            preNode = topNode.index;
            //printf( "%d pop stack\n", preNode );
            s.pop();
        }
    }

    //for( int i = 1; i <= n; i++ ) {
    //    printf( "%d node: %d %d\n", i, node[i].lchild, node[i].rchild );
    //}

    dfsPostOrder( root );
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值