树3 Tree Traversals Again(C++)
#题目
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
#C++代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct Node List;
struct Node
{
int Data;
struct Node* Lchild;
struct Node* Rchild;
};
List* CreatNode(int Data)
{
List* list = new List;
list->Data = Data;
list->Lchild = NULL;
list->Rchild = NULL;
return list;
}
int main()
{
int n = 0;
cin >> n;
vector<List*> stack;//创建堆栈
string s;
List* temp = NULL;
int t = 0;
List* head = NULL;
for(int i=0;i<2*n;i++) //读取数据并生成一个二叉树
{
cin >> s;
if (s == "Push")
{
cin >> t;
if (temp != NULL)
{
if (temp->Lchild == NULL)
{
temp->Lchild = CreatNode(t);
stack.push_back(temp->Lchild);
temp = temp->Lchild;
}
else if (temp->Rchild == NULL)
{
temp->Rchild = CreatNode(t);
stack.push_back(temp->Rchild);
temp = temp->Rchild;
}
}
else {
temp = CreatNode(t);
stack.push_back(temp);
head = temp;
}
}
if (s == "Pop")
{
temp = stack.back();
stack.pop_back();
}
}
vector<int> res;
List* p;
p = head;
while (p != NULL || stack.size() != 0) //用根->右->左的方式遍历二叉树,生成一个逆序的后序遍历数组
{
while (p != NULL)
{
res.push_back(p->Data);
stack.push_back(p);
p = p->Rchild;
}
if (stack.size() != 0)
{
p = stack.back();
stack.pop_back();
p = p->Lchild;
}
}
reverse(res.begin(), res.end()); //逆序排列
for (vector<int>::iterator it = res.begin(); it != res.end(); it++) //输出
{
cout << *it;
if (it != res.end() - 1)
cout << " ";
}
system("pause");
return 0;
}