c语言二叉树的还原,由中序遍历和层次遍历还原二叉树。C语言实现

经测,该代码已经修改正确,只需在void BuildTree(char *level,char *inorder,pBiTree T)这里的最后一个变量T改为引用即可。还有一个地方判断调用右子树的地方的判断条件。

#include聽

#include聽

#include聽

typedef聽struct聽_BiTree

{

聽聽聽聽char聽data;

聽聽聽聽struct聽_BiTree聽*lchild;

聽聽聽聽struct聽_BiTree聽*rchild;

}BiNode,聽*pBiTree;

void聽BuildTree(char聽*level,char聽*inorder,pBiTree聽&T)

{

聽聽聽聽int聽i;

聽聽聽聽int聽len=strlen(level);聽聽//取得层次遍历长度

聽聽聽聽int聽pos=0;

聽聽聽聽if(len==0)

聽聽聽聽聽聽聽聽return聽;

聽聽聽聽char聽*p=strchr(inorder,level[0]);

聽聽聽聽if(p==NULL)聽聽聽聽聽//如果为空则抛弃第一个,跳到下一个;

聽聽聽聽{

聽聽聽聽聽聽聽聽char聽*L=(char*)malloc(sizeof(char)*len);聽聽聽聽//开辟数组

聽聽聽聽聽聽聽聽strncpy(L,level+1,len-1);聽聽聽聽聽聽聽//舍弃第一个

聽聽聽聽聽聽聽聽L[len-1]=0;

聽聽聽聽聽聽聽聽BuildTree(L,inorder,T);聽聽聽聽聽//调用建树函数

聽聽聽聽聽聽聽聽return聽;

聽聽聽聽}

聽聽聽聽pos=p-inorder;聽聽聽聽聽聽//得到中序遍历左子树字符串长度

聽聽聽聽T->data=level[0];聽聽聽//为根节点赋值

聽聽聽聽T->lchild=NULL;

聽聽聽聽T->rchild=NULL;

聽聽聽聽if(pos!=0)聽聽//左子树的递归调用

聽聽聽聽{

聽聽聽聽聽聽聽聽T->lchild=(pBiTree)malloc(sizeof(BiNode));

聽聽聽聽聽聽聽聽char聽*left_level=(char*)malloc(sizeof(char)*len);

聽聽聽聽聽聽聽聽char聽*left_inor=(char*)malloc(sizeof(char)*(pos));

聽聽聽聽聽聽聽聽strncpy(left_level,level+1,len-1);聽聽//舍去层次遍历第一个

聽聽聽聽聽聽聽聽strncpy(left_inor,inorder,pos);聽聽聽聽聽//截取左子树字符串

聽聽聽聽聽聽聽聽left_level[len-1]=0;

聽聽聽聽聽聽聽聽left_inor[pos]=0;

聽聽聽聽聽聽聽聽BuildTree(left_level,left_inor,T->lchild);

聽聽聽聽}

聽聽聽聽if(pos聽rchild=(pBiTree)malloc(sizeof(BiNode));

聽聽聽聽聽聽聽聽char聽*right_level=(char*)malloc(sizeof(char)*(len));

聽聽聽聽聽聽聽聽char聽*right_inor=(char*)malloc(sizeof(char)*(len-pos));

聽聽聽聽聽聽聽聽strncpy(right_level,level+1,len-1);

聽聽聽聽聽聽聽聽strncpy(right_inor,inorder+pos+1,len-pos-1);

聽聽聽聽聽聽聽聽right_level[len-1]=0;

聽聽聽聽聽聽聽聽right_inor[len-pos-1]=0;

聽聽聽聽聽聽聽聽BuildTree(right_level,right_inor,T->rchild);

聽聽聽聽}

}

void聽priOrder(pBiTree聽T)

{

聽聽聽聽if聽(T聽!=聽NULL){

聽聽聽聽聽聽聽聽printf聽("%c",聽T->data);

聽聽聽聽聽聽聽聽priOrder(T->lchild);

聽聽聽聽聽聽聽聽priOrder(T->rchild);

聽聽聽聽}

}

void聽postOrder(pBiTree聽T)

{

聽聽聽聽if聽(T聽!=聽NULL){

聽聽聽聽聽聽聽聽postOrder(T->lchild);

聽聽聽聽聽聽聽聽postOrder(T->rchild);

聽聽聽聽聽聽聽聽printf聽("%c",聽T->data);

聽聽聽聽}

}

void聽freeNode(pBiTree聽&T)

{

聽聽聽聽if聽(T聽!=聽NULL){

聽聽聽聽聽聽聽聽freeNode(T->lchild);

聽聽聽聽聽聽聽聽freeNode(T->rchild);

聽聽聽聽聽聽聽聽free(T);

聽聽聽聽}

}

int聽main()

{

聽聽聽聽pBiTree聽root;

聽聽聽聽char聽level[28],聽inorder[28];

聽聽聽聽int聽n;

聽聽聽聽scanf聽("%d",聽&n);

聽聽聽聽//fflush(stdin);

聽聽聽聽getchar();

聽聽聽聽while聽(n聽--){

聽聽聽聽聽聽聽聽scanf聽("%s%s",聽level,聽inorder);

聽聽聽聽聽聽聽聽root聽=聽(pBiTree)malloc(sizeof(BiNode));

聽聽聽聽聽聽聽聽BuildTree(level,聽inorder,聽root);

聽聽聽聽聽聽聽聽priOrder(root);

聽聽聽聽聽聽聽聽printf聽("\n");

聽聽聽聽聽聽聽聽postOrder(root);

聽聽聽聽聽聽聽聽printf聽("\n");

聽聽聽聽聽聽聽聽//freeNode(root);

聽聽聽聽}

聽聽聽聽return聽0;

}thread-77693-1-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值