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 PopSample 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;
}