给出一棵二叉树的中序和前序遍历,输出它的后序遍历。
Input
本题有多组数据,输入处理到文件结束。
每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点。
接下来的一行每行包括n个整数,表示这棵树的中序遍历。
接下来的一行每行包括n个整数,表示这棵树的前序遍历。
3<= n <= 100
Output每组输出包括一行,表示这棵树的后序遍历。
Sample Input
7
4 2 5 1 6 3 7
4 2 5 1 6 3 7
1 2 4 5 3 6 7
Sample Output
4 5 2 6 7 3 1
这里后序遍历写了一个非递归,嗯,为考研做准备。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int Data;
struct Node *Left,*Right;
}Node;
int q[100],z[100];///q记录前序遍历 z记录中序遍历
Node* creatNode() {
Node *node = (Node *)malloc(sizeof(Node));
if(node == NULL) exit(0);
node -> Left = node -> Right = NULL;
return node;
}
Node* rTree(int q1,int q2,int z1,int z2) {
Node *node = creatNode();
node -> Data = q[q1];
for(int i = z1;i <= z2;i ++) {
if(z[i] == q[q1]) {
if(i != z1) node -> Left = rTree(q1 + 1,q1 + i - z1,z1,i - 1);
if(i != z2) node -> Right = rTree(q1 + i - z1 + 1,q2,i + 1,z2);//右儿子构建
break;
}
}
return node;
}
//void postOrder(Node *node) {
// if(node == NULL) return;
// postOrder(node -> Left);
// postOrder(node -> Right);
// printf("%d ",node -> Data);
//}
void postOrder(Node *node) {
Node *s[100];
char num[100] = {0};
int c = 0;
s[c ++] = node;
while(c) {
Node *temp = s[c - 1];
if(num[c - 1]) {
num[c - 1] = 0;
printf("%d ",s[-- c] -> Data);
}
else {
num[c - 1] = 1;
if(temp -> Right) {
s[c ++] = temp -> Right;
}
if(temp -> Left) {
s[c ++] = temp -> Left;
}
}
}
}
int main() {
int n;
Node *tree;
while(~scanf("%d",&n)) {
for(int i = 0;i < n;i ++) {
scanf("%d",&z[i]);
}
for(int i = 0;i < n;i ++) {
scanf("%d",&q[i]);
}
tree = rTree(0,n - 1,0,n - 1);
postOrder(tree);
putchar('\n');
}
return 0;
}