| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 451 人关注过本帖
标题:请帮我看看左孩子为什么找不到?
只看楼主 加入收藏
chuanglan
Rank: 2
等 级:论坛游民
威 望:2
帖 子:91
专家分:29
注 册:2012-8-14
结帖率:84.62%
收藏
已结贴  问题点数:15 回复次数:4 
请帮我看看左孩子为什么找不到?
#include<stdio.h>
#include<malloc.h>
#define NULL 0
typedef struct BinerTree
{
   char data;
   struct BinerTree *Lchild,*Rchild,*Parent;
}BT,*BtNode;

void InitataBT(BT **B)
{
   (*B)->Lchild = NULL;
   (*B)->Rchild = NULL;
   (*B)->Parent = NULL;
}

void Creat(BT **B) //用递归来创建树,而节点之间的关系是链接的方式,
{
    char ch;
    ch = getchar();
    if(ch == '.')
         *B = NULL;
    else
       {
         if( (*B = (BT *)malloc(sizeof(BT)))==NULL)
          {
            puts("error memory assignment!");
            exit(0);
          }
          (*B)->data = ch;
          Creat(&((*B)->Lchild));
          Creat(&((*B)->Rchild));
       }  
}

void visit(BT *TreeNode)
{
    printf("%3c",TreeNode->data);
}

void PreOrder(BT *B)
{
   if(B != NULL)
    {
      visit(B);
      PreOrder(B->Lchild);
      PreOrder(B->Rchild);
    }
}

void InOrder(BT *B)
{
   if(B != NULL)
     {
       InOrder(B->Lchild);
       visit(B);
       InOrder(B->Rchild);
     }
}

void PostOrder(BT *B)
{
   if(B != NULL)
     {
       PostOrder(B->Lchild);
       PostOrder(B->Rchild);
       visit(B);
     }
}


BtNode LeftChild(BT *B,char ch)  // 左孩子查找,不过如果没有左孩子这种情况还没有考虑
{
   if(B != NULL)             //根据创建的结构来进行查询,参考创建部分,因此得出仍然按三种遍历方式来查询?
    {
      if(B->data == ch)
        if(B->Lchild!=NULL)
          return  B->Lchild;
        else return NULL;
      LeftChild(B->Lchild,ch);
      LeftChild(B->Rchild,ch);
    }
   return NULL;  
}

void main()
{
   BT *Btree;
   BtNode q;
   int OrdSeq;
   char node;
   InitataBT(&Btree);
   Creat(&Btree);
   printf("please input 1 to PreOrder the tree:\nplease input 2 to InOrder the tree:\nplease input 3 to PostOrder the tree:\n");
   scanf("%d",&OrdSeq);
   switch(OrdSeq)
      {
           case 1:  PreOrder(Btree); break;
           case 2:  InOrder(Btree);  break;
           case 3:  PostOrder(Btree); break;
           default :puts("wrong choice!");break;
      }
   getchar();
   puts("\nPlease input the node you are finding:");
   scanf("%c",&node);
   if( !(q = LeftChild(Btree,node)) )
     puts("Sorry!I didn't find the leftchild!\1");
   else printf("%5c",q->data);
   getch();
}
搜索更多相关主题的帖子: void include 
2012-11-30 21:14
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:11 
回复 楼主 chuanglan
附上你操作不正确的数据  和结果

只是找某个结点的左孩子   不正确?
还是 说还存在别的什么功能不正常?
2012-11-30 21:42
chuanglan
Rank: 2
等 级:论坛游民
威 望:2
帖 子:91
专家分:29
注 册:2012-8-14
收藏
得分:0 
嗯,就是找不到左孩子,
截屏我不会放到这个上面..
2012-12-02 12:51
chuanglan
Rank: 2
等 级:论坛游民
威 望:2
帖 子:91
专家分:29
注 册:2012-8-14
收藏
得分:0 
就是求做孩子这一函数有问题,其他应该是对的
2012-12-02 15:57
chuanglan
Rank: 2
等 级:论坛游民
威 望:2
帖 子:91
专家分:29
注 册:2012-8-14
收藏
得分:0 
void LeftChild(BiTree B,char ch)     //传进来的是树的头结点
{
   if(B != NULL)     // 如果树非空
    {
      if(B->data == ch)          // 并且节点存在
        if( B->Lchild != NULL )     //   其左孩子非空,就找到了,返回其做孩子的指针值;
           visit(B->Lchild);
        else {
                SearchLeftHint();     // 如果找到了节点但是没有左孩子,那么也返回NULL;
                exit(0);
             }
      LeftChild(B->Lchild,ch);         //  求他左子树上面的节点的左孩子
      LeftChild(B->Rchild,ch);           //  求他右子树上面的节点的左孩子
    }
   SearchLeftHint();             // 到此,基本所有的情况都包含了,没有做孩子,查找的节点不存在,
}

如果我把这个子函数写成这样,他能找出来左孩子,如果像之前那样需要通过返回值的话,找不到,并且WinTc会提示说
 if( !(q = LeftChild(T,charnode)) )
 这句代码赋值可能不正确,不知道是不是这里的原因。希望大家帮忙看看,这真的超出我的水平了,不胜感激!
2012-12-03 15:37
快速回复:请帮我看看左孩子为什么找不到?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038418 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved