题意:给定二叉树的中序、前序遍历,输出后序遍历
解题思路:
- 很基础的问题,根据中序前序建树,然后后序遍历就行了
- 大致思想:前序的第一个就是根节点,然后在中序中找到这个节点,这个节点左边的就是左子树,右边就是右子树,递归一下就OK了
代码:
/*
ID: zc.rene1
LANG: C
PROG: heritage
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_NODE 26
struct node
{
char c;
struct node *left, *right;
};
char in[MAX_NODE + 1];
char pre[MAX_NODE + 1];
FILE *fout;
void BuildTree(struct node *head, int in_left, int pre_left, int len)
{
int i;
head->c = pre[pre_left];
for (i=in_left; i<in_left+len; i++)
{
if (in[i] == head->c)
{
break;
}
}
if (i - in_left > 0)
{
head->left = (struct node *)malloc(sizeof(struct node));
BuildTree(head->left, in_left, pre_left + 1, i - in_left);
}
if (len - i + in_left - 1 > 0)
{
head->right = (struct node *)malloc(sizeof(struct node));
BuildTree(head->right, i + 1, pre_left + i - in_left + 1, len - i + in_left - 1);
}
}
void PrintPost(struct node *head)
{
if (head->left != NULL)
{
PrintPost(head->left);
}
if (head->right != NULL)
{
PrintPost(head->right);
}
fprintf(fout, "%c", head->c);
}
int main(void)
{
FILE *fin;
fin = fopen("heritage.in", "r");
fout = fopen("heritage.out", "w");
memset(in, 0, (MAX_NODE + 1) * sizeof(char));
memset(pre, 0, (MAX_NODE + 1) * sizeof(char));
/*get input*/
fscanf(fin, "%s\n%s\n", in, pre);
/*build the tree*/
struct node * head = (struct node *)malloc(sizeof(struct node));
BuildTree(head, 0, 0, strlen(pre));
PrintPost(head);
fprintf(fout, "\n");
return 0;
}