由遍历序列恢复二叉树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<stdio.h>
#include<stdlib.h>
#define null 0
#define max 20
int counter=0;
typedef struct btreenode
{int data;
struct btreenode *lchild;
struct btreenode *rchild;
}bnode;
int idex(char arg[],char s,int n);
char pred[2*max],inod[2*max];
int n=0,k0=0;
bnode *restore(int l,int r,int k,char pred[],char inod[]) {
int i1,i0,k1;
bnode *p;
p=(bnode*)malloc(sizeof(bnode));
p->data=pred[k0];
p->lchild=p->rchild=null;
if(k0+1>r-1)
return(p);
i0=idex(inod,pred[k0],r+1);
i1=idex(inod,pred[k0+1],r+1);
k1=idex(pred,inod[i0+1],r+1);
k0++;
if(l<i0&&i0<=r)
{p->lchild=restore(k0,i0,k0,pred,inod);
if(i0+1>=r&&k<i1)
return(p);
else
if(k>1&&i0>k1)
return(p);
k0++;
p->rchild=restore(i0+1,r,k0,pred,inod);
}
else
{if(i0<=1&&i0>i1)
p->lchild=restore(k0,i0,k0,pred,inod);
if(k1>=k0)
{k0++;
p->rchild=restore(k0,r,k0,pred,inod);
}
}
return(p);
}
int idex(char arg[],char s,int n)
{
int i;
for(i=0;i<n;i++)
{if(arg[i]==s)
return(i);
}
}
void print(char s[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%c",s[i]);
printf("\n");
}
void prtree(bnode *p)
{
if(p==null)
return;
printf("%d\t%u\t%u\t%u\t%u\n",++counter,p,p->data,p->lchild,p->rchild);
if(p->lchild!=null)
prtree(p->lchild);
if(p->rchild!=null)
prtree(p->rchild);
}
main()
{
bnode *root;
char pred[max],ch;
int n=0;
printf("pred:");
while((ch=getchar())!='\n')
pred[n++]=ch;
n=0;
printf("inod:");
while((ch=getchar())!='\n')
inod[n++]=ch;
root=restore(0,n-1,0,pred,inod);
printf("structure of the binary tree\n");
printf("counter\taddress\tdata\tlchild\trchild\n");
prtree(root);
printf("\n");
system("pause");
}。

相关文档
最新文档