在写的时候,突然想到 如果二叉树中有相同的字母 ,那么根据前序遍历与中序遍历的结果确定的二叉树可能会出错比如 前序遍历的结果为a a a,中序遍历的结果也为a a a,则对于这种情况建的二叉树可能不一样,但同样满足要求,
下面的程序是在二叉树中没有相同的字母出现,从而能唯一确定二叉树
// 树中各字符均不相同,否则有可能建的数不唯一
#include <iostream>
#include <string.h>
using namespace std;
class tree
{
public:
char c;
tree *lchild,*rchild;
};
int main()
{
void deal(string str_pretravel,string str_intravel,tree* &p);
void Pretravel(tree *p);
void Intravel(tree *p);
int i,j,n,m,s,t;
tree *head;
string str_pretravel,str_intravel;
cout<<"请输入前序遍历的结果:"<<endl;
cin>>str_pretravel;
cout<<"请输入中序遍历的结果:"<<endl;
cin>>str_intravel;
deal(str_pretravel,str_intravel,head);
//遍历二叉树
cout<<"前序遍历的结果为:"<<endl;
Pretravel(head); //前序遍历
cout<<endl;
cout<<"中序遍历的结果为:"<<endl;
Intravel(head); //非递归中序遍历
cout<<endl;
return 0;
}
void deal(string str_pretravel,string str_intravel,tree* &p)
{
int i,j;
string s1,s2;
string s4,s5;
int x,l1,l2;
char s3[10000];
if(str_pretravel.size()==0)
{
p=NULL;
return ;
}
p=new(tree);
p->c=str_pretravel[0];
for( i=0,j=0;i<=str_intravel.size()-1;i++)
{
if(str_intravel[i]==str_pretravel[0])
{
break;
}else
{
s3[j++]=str_intravel[i];
}
}
s3[j]='\0'; s1=s3;
l1=i;
for(i=i+1,j=0;i<=str_intravel.size()-1;i++)
{
s3[j++]=str_intravel[i];
}
s3[j]='\0';
s2=s3;
for(i=1,j=0;i<=l1;i++,j++)
{
s3[j]=str_pretravel[i];
}
s3[j]='\0';
s4=s3;
for(i=l1+1,j=0;i<=str_pretravel.size()-1;i++)
{
s3[j++]=str_pretravel[i];
}
s3[j]='\0';
s5=s3;
deal(s4,s1,p->lchild); deal(s5,s2,p->rchild);
}
void Pretravel(tree *p)
{
if(p)
{
cout<<p->c;
Pretravel(p->lchild);
Pretravel(p->rchild);
}
}
void Intravel(tree *p)
{
tree *statck[100000];
int top=0;
while(p||top>0)
{
if(p)
{
statck[top++]=p;
p=p->lchild;
}else
{
p=statck[--top];
cout<<p->c;
p=p->rchild;
}
}
}