注册 登录
编程论坛 数据结构与算法

请帮我看看左孩子为什么找不到?

chuanglan 发布于 2012-11-30 21:14, 451 次点击
#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();
}
4 回复
#2
寒风中的细雨2012-11-30 21:42
回复 楼主 chuanglan
附上你操作不正确的数据  和结果

只是找某个结点的左孩子   不正确?
还是 说还存在别的什么功能不正常?
#3
chuanglan2012-12-02 12:51
嗯,就是找不到左孩子,
截屏我不会放到这个上面..
#4
chuanglan2012-12-02 15:57
就是求做孩子这一函数有问题,其他应该是对的
#5
chuanglan2012-12-03 15:37
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)) )
 这句代码赋值可能不正确,不知道是不是这里的原因。希望大家帮忙看看,这真的超出我的水平了,不胜感激!
1