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 <stack>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
#define Empty (-1)
template<class T>
struct TreeNode
{
T data;
TreeNode<T> *left;
TreeNode<T> *right;
TreeNode(const T d = T(-1)) :data(d), left(nullptr), right(nullptr) {}
};
template<class T>
TreeNode<T>* createTree()
{
fstream file("data.txt");
int nodeNum = 0;
file >> nodeNum;
if (nodeNum == 0)
return nullptr;
stack<TreeNode<T>*> stack;
TreeNode<T> *root = nullptr;
TreeNode<T> *cur = nullptr;
bool lastActionIsPop = false; //記錄上一次操作是否是POP
for (int i = 0; i < nodeNum *2; i++)
{
string action;
file >> action;
if (action == "Push")
{
T item;
file >> item;
if (root == nullptr)
{
root = new TreeNode<T>(item);
cur = root;
stack.push(cur);
}
else
{
TreeNode<T> *tmp = new TreeNode<T>(item);
if (lastActionIsPop)
cur->right = tmp;
else
cur->left = tmp;
cur = tmp;
stack.push(cur);
}
lastActionIsPop = false;
}
else if (action == "Pop")
{
cur = stack.top(); //return reference in the top
stack.pop(); //none retval
lastActionIsPop = true;
}
}
file.close();
return root;
}
template<class T>
void postorderTraversal(TreeNode<T> *root, string &res)
{
if (root == nullptr) return;
postorderTraversal(root->left, res);
postorderTraversal(root->right, res);
stringstream os;
os << root->data;
res += (os.str() + " ");
}
int main()
{
string res = "";
TreeNode<char> *root = createTree<char>();
postorderTraversal<char>(root, res);
cout << res.substr(0, res.size() - 1); //不輸出最後面的空格
system("pause");
return 0;
}