题目
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 <iostream>
#include <stdio.h>
#include <stack>
#include <vector>
using namespace std;
vector<int> preOrder;
vector<int> inOrder;
vector<int> result;
class binNode{
public:
int data;
binNode* lchild;
binNode* rchild;
};
binNode* buildTree(int inL, int inR, int preRoot) {
if (inL > inR) return 0;
int inRoot = inL;
while (inOrder[inRoot] != preOrder[preRoot]) inRoot++;
binNode* node = new binNode;
node->data = inOrder[inRoot];
node->lchild = buildTree(inL, inRoot - 1, preRoot + 1);
node->rchild = buildTree(inRoot + 1, inR, preRoot + inRoot - inL + 1);
return node;
}
void postOrder(binNode* tree) {
if (tree != NULL) {
postOrder(tree->lchild);
postOrder(tree->rchild);
result.push_back(tree->data);
}
}
int main()
{
string op;
int n;
cin >> n;
int key;
stack<int> stk;
for (int i = 0; i < 2 * n; i++) {
cin >> op;
if (op == "Push") {
cin >> key;
stk.push(key);
preOrder.push_back(key);
}
else {
inOrder.push_back(stk.top());
stk.pop();
}
}
binNode* tree;
tree = buildTree(0, n - 1, 0);
postOrder(tree);
for (int i = 0; i < n; i++) {
cout << result[i];
if (i + 1 != n) cout << " ";
}
}
注意事项和总结
比较常规