#include <iostream>
#include <stack>
#define MaxTree 30
using namespace std;
struct TreeNode {
int num;
int left;
int right;
} Tree[MaxTree]; // 数组指引就是数字的次序
struct Input {
int num;
string op;
};
void BuildTree( TreeNode T[] ) { // 难...想了好久, 注意是数组地址传进来, 所以可以修改
int N, Od, Order = -1;
stack<int> MyStack; // 存放输入数字的次序
cin >> N;
struct Input In[N * 2];
for( int i = 0; i < N * 2; i++ ) { // 将“操作”先存起来, 因为后接Push的Pop比较特殊
cin >> In[i].op;
if( In[i].op == "Push" )
cin >> In[i].num;
}
for( int i = 0; i < N * 2; i++ ) {
if( In[i].op == "Push" ) {
T[++Order].num = In[i].num; // Order为当前次序
T[Order].left = T[Order].right = -1; // 初始化为-1
if( i && !MyStack.empty() ) { // i == 0时为根节点
Od = MyStack.top(); // 栈顶数字的次序
if( T[Od].left == -1 ) T[Od].left = Order; // 让栈顶数字指向当前数字
}
MyStack.push(Order);
}
else if( In[i].op == "Pop" ) {
if( i < N * 2 - 1 && In[i + 1].op == "Push" ) { // 后接Push的Pop, 先让right预先指向下一个数字, 再Pop
Od = MyStack.top();
T[Od].right = Order + 1; // 下一个数字的次序
}
MyStack.pop();
}
}
}
bool flag = false;
void PostOrderTraversal( int Root ) { // 递归版后序遍历
if( Root != -1 ) {
PostOrderTraversal( Tree[Root].left );
PostOrderTraversal( Tree[Root].right );
if( flag ) cout << " ";
flag = true;
cout << Tree[Root].num;
}
}
int main() {
BuildTree( Tree );
PostOrderTraversal( 0 );
}
03-树3 Tree Traversals Again(1086)
最新推荐文章于 2024-07-10 22:49:54 发布