题目链接:https://acm.sdut.edu.cn/onlinejudge3/contests/3982/problems/B

模板借鉴:https://www.cnblogs.com/cynchanpin/p/6758429.html

代码的实现是以先序遍历为主,利用先序遍历和中序遍历中元素的位置来控制左右孩子

递归部分想要跟踪起来挺麻烦的,我跟踪了一遍但是感觉靠跟踪记住公式不大行。

其实数的ls和rs部分就是利用中序来区别左子树和右子树,从一颗大树按照规则一步步往下分

例如   ABDCEF   BDAECF  

左子树就是从front+1开始的  index个长度

右子树就是从front+1+index开始的剩下长度  也就是len-index-1

这样就通了,剩下的交给递归,一层一层的让电脑去划分

AC代码:


#include<bits/stdc++.h>
using namespace std;
struct treet{
	char data;
	treet *ls;
	treet *rs; 
};
int find(char ch,char *center,int len)
{
	for(int i=0;i<len;i++)
		if(center[i]==ch)
			return i;
	return -1;
}
treet *create(char *front,char *center,int len)
{
	if(len<=0)
		return NULL;
	treet *tr = new treet;
	tr->data = *front;
	cout<<tr->data<<' ';
	int index = find(*front,center,len);
	tr->ls = create(front+1,center,index);
	tr->rs = create(front+index+1,center+index+1,len-index-1);
	return tr;
}
void houxu(treet *tr)
{
	if(tr==NULL)
		return;
	else
	{
		houxu(tr->ls);
		houxu(tr->rs);
		cout<<tr->data;
	}
}
int main()
{
	char *front = new char [100];
	char *center = new char [100];
	cin>>front;
	cin>>center;
	treet *tr = create(front,center,strlen(front));
	houxu(tr); 
}