原题:1086. Tree Traversals Again (25)
解题思路:
实际上入栈顺序就是前序遍历,出栈顺序就是中序遍历,那么有了两个遍历就可以直接构造一个二叉树,后续遍历也就可以直接得到。
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
const int maxn = 30 + 5;
struct Node
{
int id;
Node* lchild, *rchild, *parent;
Node(){id = 0; lchild = NULL; rchild = NULL; parent = NULL;}
};
int preOrder[maxn], inOrder[maxn];
void build(Node* &root, int l1, int r1, int l2, int r2)
{
if(l1 > r1) return ;
root = new Node();
root->id = preOrder[l1];
int k;
for(k = l2; k <= r2; k++)
if(inOrder[k] == preOrder[l1]) break;
int c = k - l2;
build(root->lchild, l1+1, l1+c, l2, k-1);
build(root->rchild, l1+c+1, r1, k+1, r2);
}
void postOrder(Node* root, int &first)
{
if(root->lchild != NULL)
postOrder(root->lchild, first);
if(root->rchild != NULL)
postOrder(root->rchild, first);
if(first) {printf("%d", root->id); first = 0;}
else printf(" %d", root->id);
}
int main()
{
int n;
while(scanf("%d", &n) == 1)
{
stack<int> sta;
int cnt = 0, cPre = 0, cIn = 0;
while(cnt < n)
{
char cmd[5];
int x;
scanf("%s", cmd);
if(cmd[1] == 'u')
{
scanf("%d", &x);
sta.push(x);
preOrder[cPre++] = x;
}
else
{
inOrder[cIn++] = sta.top();
sta.pop();
cnt++;
}
}
Node* root = NULL;
build(root, 0, n-1, 0, n-1);
int first = 1;
postOrder(root, first);
printf("\n");
}
return 0;
}