已知中序后序求前序

方法一:构建二叉树方法

#include
using namespace std;
char zh[20],hou[20],qi[20];
struct node{
	char le;
	node *l;
	node *r;
};
int chazhao(char zh[],char ch)
{
	for(int i = 0; i < strlen(zh); i++)
	if(zh[i]==ch) {
		return i;
	}
}
void work(node *q,char *zh ,char *hou)
{
	if(strlen(zh)==0){
//		q = NULL;
		q->le = '0';
		q->l = NULL;
		q->r = NULL;
		return;
	}
	int mid = chazhao(zh,hou[strlen(hou)-1]);
	q->le = hou[strlen(hou)-1];
	
	node *lc=new node,*rc=new node;
	lc->l=NULL;lc->r=NULL;
	rc->l=NULL;rc->r=NULL;
	q->l = lc;
	q->r = rc;
	
	char zhl[20],zhr[20],houl[20],hour[20];
//	 A 
//	A
	strncpy(zhl,zh,mid);zhl[mid] = '\0';//DBFE
	strncpy(zhr,zh+mid+1,strlen(zh)-mid-1);zhr[strlen(zh)-mid-1] = '\0';//CG
	strncpy(houl,hou,mid);houl[mid] = '\0';//DFEB
	strncpy(hour,hou+mid,strlen(zh)-mid-1);hour[strlen(zh)-mid-1] = '\0'; //GC
	
	work(q->l,zhl,houl);
	work(q->r,zhr,hour);
}

void qian(node *p)
{
	if(p->le=='0')return ;
	
	cout << p->le << " ";
	qian(p->l);
	qian(p->r);
}

int main()
{
	cin>> zh;
	cin >> hou;
	node *p=new node;
	p->l=NULL;
	p->r=NULL;
	
	work(p,zh,hou);
	
	qian(p);
	
	return 0;
}


/*
DBFEACG
DFEBGCA

*/

方法二 直接递归


#include
using namespace std;
 
char post[]="DFEBGCA";
char mid[]="DBFEACG";
 
void pre(int root, int start, int end)	      //当前树的根节点在后序里的下标  中序中的起始位置  结束位置
{
    if(end-start<0)	return ;
    
	int i=start;
    for(i = start; i<=end; i++) 	      //寻找中序序列中根节点的位置
		if(mid[i]==post[root]) break;

    printf("%c ", post[root]);
    
    pre(root-1-(end-i),start,i-1);	      //查询左子树 
    pre(root-1,i+1,end);		      //查询右子树
}
 
int main() 
{
    pre(6,0,6);
    return 0;
}


你可能感兴趣的:(数据结构与算法原理,c++)