首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

树的遍历有关问题

2013-06-26 
树的遍历问题?应该是建好树后指针有问题但是找不出来,哪位给看看#includestdio.h#includestdlib.h#inc

树的遍历问题?

应该是建好树后指针有问题但是找不出来,哪位给看看




#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct bitnode
{
char data;
struct bitnode *lchild, *rchild;
}bitnode,*bitree;
//构建二叉树
void jianshu(bitree T)
{


printf("请输入该节点数据:");
scanf("%c",&T->data);
getchar();
if(T->data!='#')
{
T->lchild=(bitree)malloc(sizeof(bitnode));
jianshu(T->lchild);
T->rchild=(bitree)malloc(sizeof(bitnode));
jianshu(T->rchild);
}
return;
}
//节点数据输出
int visit(bitree a)
{
if(a->data!='#')
{
printf("该节点数据为%c",a->data);
return 1 ;
}
else
{
//a->data=NULL;
//printf("该节点数据为空!");
return 0;
}
}
//先序遍历
int xianxu(bitree T)
{
if(T)
{
if(visit(T))
if(xianxu(T->lchild))
if(xianxu(T->rchild))
return 1;
}
else
return 0;
}
//中序遍历
int zhongxu(bitree T)
{
if(T)
{
if(zhongxu(T->lchild))
if(visit(T))
if(zhongxu(T->rchild))
return 1;
}
else
return 0;
}
//后序遍历
int houxu(bitree T)
{
if(T)
{
if(houxu(T->lchild))
if(houxu(T->rchild))
if(visit(T))
return 1;
}
else
return 0;
}
//统计叶子节点数
void yezi(bitree T,int *k)
{
if(T)
{
if(T->data=='#')
*k++;
else
{
yezi(T->lchild,k);
yezi(T->rchild,k);
}
return;

}
else 
{
printf("该树还没有建立!");
return;
}
}

int main(void)
{
int i,j=1,k=0;
bitnode T;
while(j)
{
printf("\t********功能表**********************\n");
printf("\t********0、建立树*******************\n");
printf("\t********1、先序遍历*****************\n");
printf("\t********2、中序遍历*****************\n");
printf("\t********3、后序遍历*****************\n");
printf("\t********4、统计叶子节点数***********\n");
printf("\t********5、退出*********************\n");
scanf("%d",&i);
getchar();
switch(i)
{
case 0:jianshu(&T);break;
case 1:i=xianxu(&T);break;
case 2:i=zhongxu(&T);break;
case 3:i=houxu(&T);break;
case 4:yezi(&T,&k);printf("该树中有%d个叶子节点\n",k);break;
case 5:j--;break;
default:printf("输入有错!");break;
}


/*
if(i)
printf("遍历成功!");
else
printf("二叉树不存在,遍历失败");
*/
  }
return 0;
}
遍历 C printf
[解决办法]
我正好遇到过这个问题,建树那有错误,改用二级指针带回:


void Create_Tree(BTree *T)
{
   char ch;
    ch=getchar();
    if(ch=='#')*T=NULL;
    else


    {
        *T=(BTree)malloc(sizeof(Bnode));
        (*T)->data=ch;
        Create_Tree(&(*T)->lchild);
        Create_Tree(&(*T)->rchild);
    }
}
...
main(){
Btree T;
Create_Tree(&T);
}


这样就行了.
[解决办法]
其实我个人感觉2l这样写  好像没有模块化的思想  我感觉每个功能还是用函数封装  好些
[解决办法]
建树有问题,形参是实参的副本,指针也是实参的一个副本,修改指针的地址只有用到二级指针。就好像两个实参一般变量交换不了,传递指针能修改一样,但是修改指针指向的地址就得用到二级指针。
[解决办法]
typedef struct BTnode
{
char data;
BTnode *lchild;
BTnode *rchild;
}BTnode,* BTtree;
BTtree create()//BTtree就是BTnode *
{
    BTtree T=NULL;
char ch;
printf("请输入一个数");
   ch=getchar();
    fflush(stdin);
if(ch=='#')
 T=NULL;
else
{
T=(BTnode*)malloc(sizeof(BTnode));
T->data =ch;
T->lchild=create();
T->rchild=create ();


}
return T;

}
可以用这个修改修改,感觉你建立函数的型参最好是*T

热点排行