考虑:
中序遍历得到的是“投影”,而前序遍历的第一个元素是根节点。
于是迎刃而解(指花了4个小时。。up是废物)
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#pragma warning(disable: 4996)
typedef struct TrNode {
char date;
TrNode* lson;
TrNode* rson;
}TrNode;
void copy(char fore[], char mid[], char ltf[], char ltm[], char rtf[], char rtm[], int i)
{
strncpy(ltf, fore+1, i);
ltf[i] = '\0';
strncpy(ltm, mid, i);
ltm[i] = '\0';
strncpy(rtf, fore + i + 1, strlen(fore) - i - 1);
rtf[strlen(fore) - i - 1] = '\0';
strncpy(rtm, mid + i + 1, strlen(mid) - i - 1);
rtm[strlen(mid) - i - 1] = '\0';
}
int ERR = 0;//报错码
TrNode* restore(char fore[], char mid[])
{
if (strlen(fore) == 0 && strlen(mid) == 0) return NULL;
if (strlen(fore) != strlen(mid)) {
printf("error\n");
ERR = -1;
return NULL;
}
char ltf[2048] = {};
char ltm[2048] = {};
char rtf[2048] = {};
char rtm[2048] = {};
TrNode* Head = (TrNode*)malloc(sizeof(TrNode));
char temp = fore[0];
Head->date = temp;
int i = 0;
ERR = -1;
for (; i < strlen(mid); i++)
{
if (mid[i] == temp) {
ERR = 0;
break;
}
}
//i=根节点在先序遍历中的位置
if (ERR != 0) {
printf("error\n");
return NULL;
}
copy(fore, mid, ltf, ltm, rtf, rtm, i);
Head->lson = restore(ltf, ltm);
if (ERR != 0) return NULL;
Head->rson = restore(rtf, rtm);
if (ERR != 0) return NULL;
return Head;
}
void back(TrNode* root)
{
if (root == NULL) return;
back(root->lson);
back(root->rson);
printf("%c", root->date);
}
int main()
{
char fore[2048] = {};
char mid[2048] = {};
scanf("%s", fore);
scanf("%s", mid);
TrNode* root=restore(fore, mid);
back(root);
}