7-1 Tree Traversals Again (10 分)
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.
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
Solution
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node
{
int data;
struct Node* right;
struct Node* left;
}Node;
int n;
void read(Node* tree);
Node* create();
main()
{
Node* tree;
tree=create();
read(tree);
}
Node* create()
{
Node* stack[100];
char string[50];
Node* tree;
Node* temp;
int top,i,data;
top=0;
scanf("%d",&n);
for(i=0;i<n*2;i++)
{
scanf("%s",string);
if(!strcmp(string,"Push"))
{
scanf("%d",&data);
if(!i)
{
temp=(Node*)malloc(sizeof(Node));
tree=temp;
temp->left=temp->right=NULL;
temp->data=data;
stack[top]=temp;
top=top+1;
}
else
{
Node* newNode=(Node*)malloc(sizeof(Node));
newNode->left=newNode->right=NULL;
newNode->data=data;
stack[top]=newNode;
top=top+1;
if(!temp->left)
{
temp->left=newNode;
temp=temp->left;
}
else
{
temp->right=newNode;
temp=temp->right;
}
}
}
else
{
temp=stack[top-1];
top=top-1;
}
}
return tree;
}
void read(Node* tree)
{
if(tree==NULL)
return;
read(tree->left);
read(tree->right);
printf("%d",tree->data);
n--;
if(n)
printf(" ");
}