先序中序建立二叉树Word文件下载.docx
《先序中序建立二叉树Word文件下载.docx》由会员分享,可在线阅读,更多相关《先序中序建立二叉树Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
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;
k=Search(ino,pre[ps]);
/*在中序序列中查询*/
if(k==-1){T=NULL;
puts("
错误!
!
\n"
);
T=(BiTree*)malloc(sizeof(BiTree));
if(T==NULL)exit
(1);
T->
data=pre[ps];
if(k==is)T->
lchild=NULL;
CrtBT(T->
lchild,pre,ino,ps+1,is,k-is);
if(k=is+n-1)T->
rchild=NULL;
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);
rchild);
voidmain()
charpre[size],ino[size];
intps,is,n;
BiTree*T=NULL;
enter:
"
scanf("
%s"
pre);
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
left=Rebuild(vlr+1,lvr,k);
//Buildlefttree
right=Rebuild(vlr+1+k,lvr+k+1,n-k-1);
//Buildrighttree
}
returntemp;
malloc.h>
#defineMaxSize100
typedefcharElemType;
typedefstructBiTNode/*二叉链表数据结构定义*/
DataTypedata;
structBiTNode*lchild,*rchild;
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];
//根节点
lch=NULL;
rch=NULL;
i=0;
//i表示根节点在中序中的位置
while(i<
len)
if(inorder==pre[0])
break;
i++;
p=pre+1;
//确定左子树的先序序列指针
q=inorder;
//确定左子树的中序序列指针
lch=trans(p,q,i);
//递归生成左子树
p=pre+i+1;
//确定右子树的先序序列指针
q=inorder+i+1;
//确定右子树的中序序列指针
rch=trans(p,q,len-i-1);
//递归生成右子树
returnroot;
}
intSearch(charino[],charch[])
while(ino!
if(ino==ch)
voidCrtBT(BiTree*T,charpre[],charino[],intps,intis,intn)
{intk;
k=Search(ino,pre);
if(k==-1){T=NULL;
error!
else
{
T=(BiTree*)malloc(sizeof(BiTree));
if(T==NULL)exit
(1);
T->
if(k==is)T->
else
CrtBT(T->
if(k=is+n-1)T->
}
voidpostorder(BiTree*t)
//puts("
typedefstructBTNode
structBTNode*lchild,*rchild;
BiTree*CreateBT1(char*pre,char*in,intn)
BiTree*s;
char*p;
intk;
if(n<
returnNULL;
s=(BiTree*)malloc(sizeof(BiTree));
s->
data=*pre;
for(p=in;
p<
in+n;
p++)
if(*p-=*pre)
break;
k=p-in;
s->
lchind=CreateBT1(pre+1,in,k)
rchild=CreateBT1(pre+k+1,p+1,n-k-1);
returns;