1.Reference: 白書
2.思路:先序的首節點在中序中的位置,其左半邊爲左子樹,右半邊爲右子樹,同時要將其至於後續的尾節點,再進行遞歸即可。
3.代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
input:樹的先序與中序
output:樹的後序
*/
void BuildPostOrder(char *str1, char *str2, char *ans, int length)
{
if(length <= 0)
return;
int index = strchr(str2, str1[0]) - str2; //先序的首節點在中序中的下標
ans[length - 1] = str1[0];
//利用下標,拆分左右子樹,進行遞歸
BuildPostOrder(str1 + 1, str2, ans, index);
BuildPostOrder(str1 + index + 1, str2 + index + 1, ans + index, length - index - 1);
}
int main()
{
char *str1 = (char *)malloc(10 * sizeof(char));
char *str2 = (char *)malloc(10 * sizeof(char));
char *result = (char *)malloc(11 * sizeof(char));
int length = 0;
while(scanf("%s %s", str1, str2) == 2)
{
length = strlen(str1);
BuildPostOrder(str1, str2, result, length);
result[length] = '\0';
printf("%s\n", result);
}
return 0;
}
4.結果
以上。