先序中序建立二叉树.docx
《先序中序建立二叉树.docx》由会员分享,可在线阅读,更多相关《先序中序建立二叉树.docx(11页珍藏版)》请在冰豆网上搜索。
先序中序建立二叉树
先序中序建立二叉树急~~
1二叉树中存储的数据范围仅限于26个英文字母
2程序要提示用户从键盘分别输入二叉树的先序和中序序列,接受输入后,调用相应的函数完成二叉树的创建
3成功创建二叉树后,程序自动输出该二叉树的后序遍历次序
#include
#include
#include
#definesize100
typedefstructJD
{
chardata;
structJD*lchild,*rchild;
}BiTree;
intSearch(charino[],charch)
{
inti=0;
//puts(ino)
while(ino!
=ch&&ino)
i++;
if(ino==ch)
returni;
else
return-1;
}
voidCrtBT(BiTree*T,charpre[],charino[],intps,intis,intn)/*已知pre[ps..ps+n-1]为二叉树的先序序列,ino[is..is+n-1]为二叉树的中序序列,本算法由此两个序列构造二叉链表*/
{
intk;
if(n==0)T=NULL;
else
{
k=Search(ino,pre[ps]);/*在中序序列中查询*/
if(k==-1){T=NULL;puts("错误!
!
!
\n");}
else
{
T=(BiTree*)malloc(sizeof(BiTree));
if(T==NULL)exit
(1);
T->data=pre[ps];
if(k==is)T->lchild=NULL;
else
CrtBT(T->lchild,pre,ino,ps+1,is,k-is);
if(k=is+n-1)T->rchild=NULL;
else
CrtBT(T->rchild,pre,ino,ps+1+(k-is),k+1,n-(k-is)-1);
}
}
}/*endCrtBT*/
voidpostorder(BiTree*t)//递归先序遍历
{
if(t!
=NULL)
{printf("%c\t",t->data);
postorder(t->lchild);
postorder(t->rchild);
}
}
voidmain()
{
charpre[size],ino[size];
intps,is,n;
BiTree*T=NULL;
puts("enter:
");
scanf("%s",pre);
scanf("%s",ino);
CrtBT(T,pre,ino,0,0,strlen(pre));
postorder(T);
getchar();
}
本贴来自ZDNetChina中文社区,本贴地址:
//Rebuildabinarytree
//vlr:
preordersequence
//lvr:
inordersequence
//numberofnode
BinTreeNode*Rebuild(char*vlr,char*lvr,intn)
{
if(n==0)
returnNULL;
//Findrootininordersequence
intk=0;
while(lvr[k]!
=vlr[0])
k++;
BinTreeNode*temp=newBinTreeNode();
if(lvr[k]=='#')//leafnode
temp=NULL;
else
{
temp->data=lvr[k];//Buildroot
temp->left=Rebuild(vlr+1,lvr,k);//Buildlefttree
temp->right=Rebuild(vlr+1+k,lvr+k+1,n-k-1);//Buildrighttree
}
returntemp;
}
#include
#include
#defineMaxSize100
typedefcharElemType;
typedefstructBiTNode/*二叉链表数据结构定义*/
{
DataTypedata;
structBiTNode*lchild,*rchild;
}BiTree;
#include
#include
#defineMaxSize100
typedefcharElemType;
typedefstructnode
{
ElemTypedata;
structnode*lchild;
structnode*rchild;
}BTree;
BTreenode(char*pre,char*inorder,intlen)
{
char*p,*q;
BTreeroot;
inti;
if(len<=0)
returnNULL;
root=(BTree)malloc(sizeof(BNode));
root->data=pre[0];//根节点
root->lch=NULL;
root->rch=NULL;
i=0;//i表示根节点在中序中的位置
while(i{
if(inorder==pre[0])
break;
i++;
}
p=pre+1;//确定左子树的先序序列指针
q=inorder;//确定左子树的中序序列指针
root->lch=trans(p,q,i);//递归生成左子树
p=pre+i+1;//确定右子树的先序序列指针
q=inorder+i+1;//确定右子树的中序序列指针
root->rch=trans(p,q,len-i-1);//递归生成右子树
returnroot;
}
#include
#include
#include
#definesize100
typedefstructJD
{
chardata;
structJD*lchild,*rchild;
}BiTree;
intSearch(charino[],charch[])
{
inti=0;
//puts(ino)
while(ino!
=ch&&ino)
i++;
if(ino==ch)
returni;
else
return-1;
}
voidCrtBT(BiTree*T,charpre[],charino[],intps,intis,intn)
{intk;
if(n==0)T=NULL;
else
{
k=Search(ino,pre);
if(k==-1){T=NULL;puts("error!
!
!
\n");}
else
{
T=(BiTree*)malloc(sizeof(BiTree));
if(T==NULL)exit
(1);
T->data=pre[ps];
if(k==is)T->lchild=NULL;
else
CrtBT(T->lchild,pre,ino,ps+1,is,k-is);
if(k=is+n-1)T->rchild=NULL;
else
CrtBT(T->rchild,pre,ino,ps+1+(k-is),k+1,n-(k-is)-1);
}
}
}
voidpostorder(BiTree*t)
{
if(t!
=NULL)
{printf("%c\t",t->data);
postorder(t->lchild);
postorder(t->rchild);
}
}
voidmain()
{
charpre[size],ino[size];
intps,is,n;
BiTree*T=NULL;
//puts("enter:
");
scanf("%s",pre);
scanf("%s",ino);
CrtBT(T,pre,ino,0,0,strlen(pre));
postorder(T);
getchar();
}
#include
#include
#defineMaxSize100
typedefcharElemType;
typedefstructBTNode
{
DataTypedata;
structBTNode*lchild,*rchild;
}BiTree;
BiTree*CreateBT1(char*pre,char*in,intn)
{
BiTree*s;
char*p;
intk;
if(n<=0)
returnNULL;
s=(BiTree*)malloc(sizeof(BiTree));
s->data=*pre;
for(p=in;pif(*p-=*pre)
break;
k=p-in;
s->lchind=CreateBT1(pre+1,in,k)
s->rchild=CreateBT1(pre+k+1,p+1,n-k-1);
returns;
}