免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2627 | 回复: 11
打印 上一主题 下一主题

关于二叉树的问题..请高手帮帮忙。. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-27 21:56 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>
typedef struct binode                          //线索定义....
{
char data ;
struct binode *lchild;                     //左孩子。...
struct binode *rchild;                 //右孩子...
int ltag;                                
int rtag;

} bithrnode ,*bithrtree ;



int inittree(bithrtree *t)                  //新键二叉树.....
{
char ch;
*t=(bithrtree )malloc(sizeof(bithrnode ));  //开空间.....
ch=getchar();                                  //输入结点......                             
(*t)->data=ch;
(*t)->lchild=NULL;                              
(*t)->rchild=NULL;                          //对左右子树..初始化...
     if(ch!=' ')
{
inittree(&(*t)->lchild);              //递归遍历二叉树....
inittree(&(*t)->rchild);
}
return 1;



}

int intreading(bithrtree *p,bithrnode *pre)    //线索化.......
{
if(*p)                                          
{
intreading(&(*p)->lchild,pre);          //中序线索化.....
if((*p)->lchild==NULL)                 //如果左孩子为空。.就连接前驱结点....               
{
(*p)->ltag=1;
(*p)->lchild=pre;

}
if(( pre)->rchild==NULL)             //如果右孩子为空。.就连接后续结点....
{
( pre)->rtag=1;
pre->rchild=*p;

}
pre=*p;                            //per指针。.跟上 p指针.....
intreading(&(*p)->rchild,pre);

}
return 1;


}



int InOrderThreading(bithrtree *p,bithrtree *thrt)         //线索化.......
{
bithrtree pre;                           

*thrt=(bithrtree )malloc(sizeof(bithrnode));  //开空间..
if(*thrt==NULL)
return 0;
(*thrt)->ltag=0;                   //右标志为0
(*thrt)->rtag=1;                      //右标志为1               
(*thrt)->rchild=*thrt ;              //右指针回指,,,,
if(p==NULL)
(*thrt)->lchild=*thrt;           //如果二叉树为空。.就左指针也回指..
else
{
(*thrt)->lchild=*p;              //如果不为空。. 就把。.根结点给头结点的左孩子。.
pre=*thrt;                     //pre指针。.指向头结点...
}
    intreading(p,pre);                  //调用过去..进行线索化...
(*thrt)->rtag=1;                  //最后一个结点的线索化....
pre->rchild=*thrt;
(*thrt)->rchild=pre;

return 1;



}


InOrderTraverse(bithrtree *t,bithrtree *thrt)       //二叉数输出...
{

*t=(*thrt)->lchild ;                  //头结点的左孩子给*t,,,,
while((*t)!=(*thrt))                //用来判断结束...  
{
while((*t)->ltag==0)            //如果没左孩子。..
{
*t=(*t)->lchild ;            //指向前驱。...
printf("%d %c %d\n",(*t)->ltag,(*t)->data,(*t)->rtag);


}
while((*t)->rtag==1&&(*t)->rchild!=*thrt)  //如果没有右孩子且最后一个结点不指向头结点.
{
*t=(*t)->rchild ;           //指向后续...
printf("%d %c %d\n",(*t)->ltag,(*t)->data,(*t)->rtag);


}
*t=(*t)->rchild;        //指针继续找后续。...不断变化,,,



}
return 1;




}



int main()
{
bithrtree a,thrt;  //thrt为结点

inittree(&a);
InOrderThreading(&a,&thrt);
InOrderTraverse(&a,&thrt);
return 1;

}


////////////////////////////////////////////////////////////////////////////


各位高手。.搞鸟这么多天。.还是没有搞定..真郁闷啊。.编译没有错。..就是输出没有结果。..郁闷啊..高手们..帮帮忙啊。..

论坛徽章:
0
2 [报告]
发表于 2007-05-27 21:57 |只看该作者
......忘说了。.这是二叉树的线索化...中序..线索...HELP..

论坛徽章:
0
3 [报告]
发表于 2007-05-27 22:16 |只看该作者
这样的问题还是自己慢慢调试吧~

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2007-05-27 23:09 |只看该作者
原帖由 m582445672 于 2007-5-27 21:56 发表
#include <stdio.h>
#include <stdlib.h>
typedef struct binode                          //线索定义....
{
char data ;
struct binode *lchild;                     //左孩子。...
struct  ...

如果你不会或者不愿用调试器,那么就增加些打印语句吧。

论坛徽章:
0
5 [报告]
发表于 2007-05-28 08:57 |只看该作者
帮你格式化一下,感觉哥们是不是还是个学生



  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct binode                          //线索定义....
  4. {
  5.         char data ;
  6.         struct binode *lchild;                     //左孩子。...
  7.         struct binode *rchild;                 //右孩子...
  8.         int ltag;                                
  9.         int rtag;

  10. } bithrnode ,*bithrtree ;



  11. int inittree(bithrtree *t)                  //新键二叉树.....
  12. {
  13.         char ch;
  14.         *t=(bithrtree )malloc(sizeof(bithrnode ));  //开空间.....
  15.         ch=getchar();                                  //输入结点......                             
  16.         (*t)->data=ch;
  17.         (*t)->lchild=NULL;                              
  18.         (*t)->rchild=NULL;                          //对左右子树..初始化...
  19.         if(ch!=' ')
  20.         {
  21.                 inittree(&(*t)->lchild);              //递归遍历二叉树....
  22.                 inittree(&(*t)->rchild);
  23.         }
  24.         return 1;
  25. }

  26. int intreading(bithrtree *p,bithrnode *pre)    //线索化.......
  27. {
  28.         if(*p)                                          
  29.         {
  30.                 intreading(&(*p)->lchild,pre);          //中序线索化.....
  31.                 if((*p)->lchild==NULL)                 //如果左孩子为空。.就连接前驱结点....               
  32.                 {
  33.                         (*p)->ltag=1;
  34.                         (*p)->lchild=pre;
  35.                 }
  36.                 if(( pre)->rchild==NULL)             //如果右孩子为空。.就连接后续结点....
  37.                 {
  38.                         ( pre)->rtag=1;
  39.                         pre->rchild=*p;
  40.                 }
  41.                 pre=*p;                            //per指针。.跟上 p指针.....
  42.                 intreading(&(*p)->rchild,pre);

  43.         }
  44.         return 1;
  45. }



  46. int InOrderThreading(bithrtree *p,bithrtree *thrt)         //线索化.......
  47. {
  48.         bithrtree pre;                           

  49.         *thrt=(bithrtree )malloc(sizeof(bithrnode));  //开空间..
  50.         if(*thrt==NULL)
  51.                 return 0;
  52.         (*thrt)->ltag=0;                   //右标志为0
  53.         (*thrt)->rtag=1;                      //右标志为1               
  54.         (*thrt)->rchild=*thrt ;              //右指针回指,,,,
  55.         if(p==NULL)
  56.                 (*thrt)->lchild=*thrt;           //如果二叉树为空。.就左指针也回指..
  57.         else
  58.         {
  59.                 (*thrt)->lchild=*p;              //如果不为空。. 就把。.根结点给头结点的左孩子。.
  60.                 pre=*thrt;                     //pre指针。.指向头结点...
  61.         }
  62.         intreading(p,pre);                  //调用过去..进行线索化...
  63.         (*thrt)->rtag=1;                  //最后一个结点的线索化....
  64.         pre->rchild=*thrt;
  65.         (*thrt)->rchild=pre;

  66.         return 1;
  67. }


  68. InOrderTraverse(bithrtree *t,bithrtree *thrt)       //二叉数输出...
  69. {

  70.         *t=(*thrt)->lchild ;                  //头结点的左孩子给*t,,,,
  71.         while((*t)!=(*thrt))                //用来判断结束...  
  72.         {
  73.                 while((*t)->ltag==0)            //如果没左孩子。..
  74.                 {
  75.                         *t=(*t)->lchild ;            //指向前驱。...
  76.                         printf("%d %c %d\n",(*t)->ltag,(*t)->data,(*t)->rtag);
  77.                 }
  78.                 while((*t)->rtag==1&&(*t)->rchild!=*thrt)  //如果没有右孩子且最后一个结点不指向头结点.
  79.                 {
  80.                         *t=(*t)->rchild ;           //指向后续...
  81.                         printf("%d %c %d\n",(*t)->ltag,(*t)->data,(*t)->rtag);
  82.                 }
  83.                 *t=(*t)->rchild;        //指针继续找后续。...不断变化,,,
  84.         }
  85.         return 1;
  86. }



  87. int main()
  88. {
  89.         bithrtree a,thrt;  //thrt为结点

  90.         inittree(&a);
  91.         InOrderThreading(&a,&thrt);
  92.         InOrderTraverse(&a,&thrt);
  93.         return 1;

  94. }


  95. ////////////////////////////////////////////////////////////////////////////

复制代码

[ 本帖最后由 hardboy_du 于 2007-5-28 09:02 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-05-28 10:12 |只看该作者
真头痛,这种东西要自己写不管是谁都得花一定的时间去写和调试,而且完成的功能都一样,大家都在重复制造轮子。STD的出现也就不奇怪了。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2007-05-28 12:39 |只看该作者
原帖由 ken1984 于 2007-5-28 10:12 发表
真头痛,这种东西要自己写不管是谁都得花一定的时间去写和调试,而且完成的功能都一样,大家都在重复制造轮子。STD的出现也就不奇怪了。

学习的必经阶段罢了。

论坛徽章:
0
8 [报告]
发表于 2007-05-28 12:44 |只看该作者
谁能说说线索化 有什么用,记得好像说是为了节省空间什么的

不过现实生活中没有见过。

论坛徽章:
0
9 [报告]
发表于 2007-05-28 17:05 |只看该作者
线索化后放入数组保存,好处就是随机访问

论坛徽章:
0
10 [报告]
发表于 2007-05-29 15:39 |只看该作者
花点时间学习gdb,你不会后悔花时间在这个上面的。
光用肉眼看,至少我是看不出来的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP