思路
只要知道怎么靠输入序列构树就好了,可以发现如果当前push的前一个是push,那么当前push的数是前一个push的数的左子树,否则则是前一个pop的数的右子树。但是。。最后一个样例答案错误,有没有大佬可以指点一下,谢谢了!
#include <cstdio>
#include <stack>
#include <iostream>
using namespace std;
struct Node
{
int data;
Node* lchild = NULL;
Node* rchild = NULL;
};
int N;
void postTraverse(Node* root, int &cnt){
if(root == NULL)
return;
postTraverse(root->lchild, cnt);
postTraverse(root->rchild, cnt);
cnt++;//注意cnt要放在子递归后面
if(cnt < N)
printf("%d ", root->data);
else
printf("%d\n", root->data);
}
int main(){
scanf("%d", &N);
stack<Node*> s;
Node* root;
int forePush = 0;
getchar();
for(int i = 0; i < 2 * N; i++){
string cmd;
getline(cin, cmd);
Node* tmp;
if(cmd[1] == 'u'){
Node* node = new Node;
node->data = cmd[5] - '0';
s.push(node);
if(i == 0)
root = node;
else if(forePush)
tmp->lchild = node;
else
tmp->rchild = node;
forePush = 1;
tmp = node;
}
else{
tmp = s.top();
s.pop();
forePush = 0;
}
}
int cnt = 0;
postTraverse(root, cnt);
return 0;
}