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

用队列判断完全二叉树,找不出错误

惜缘0310 发布于 2012-12-15 22:54, 533 次点击
#include "stdlib.h"
#include "stdio.h"
#define maxsize 100
struct node
{
    char date;
    struct node *lch,*rch;
};
struct node *creat(struct node *root) \\创建二叉树
{
    char x;
    int i,j;
    struct node *p,*s[maxsize];
    printf("input i,x:");
    scanf("%d,%c",&i,&x);
    while(x!='0'&&i!=0)
    {
        p=(struct node*)malloc(sizeof(struct node));
        p->date=x;
        p->lch=NULL;
        p->rch=NULL;
        s[i]=p;
        if(i==1)
        root=p;
        else
        {j=i/2;
            if(i%2==0)
            s[j]->lch=p;
            else
            s[j]->rch=p;
        }
        scanf("%d,%c",&i,&x);
    }
 
      return (root);
}
int panduan()
{    int front=1,rear=1;
    struct node *root,*s[maxsize];
    root=(struct node*)malloc(sizeof(struct node));
    root=creat(root);
     
    s[front]=root;
    while((s[front]->lch!=NULL)&&(s[front]->rch!=NULL))\\找出左右孩子有一个为空的叶子
       {
       s[++rear]=s[front]->lch;
       s[++rear]=s[front]->rch;
       front++;
       }
   if((s[front]->lch=NULL)&&(s[front]->rch!=NULL))\\若左为空右不为空则返回0
      return 0;
   else
     {
          if((s[front]->lch!=NULL)&&(s[front]->rch=NULL))\\若左不为空右为空则左进队
             {s[++rear]=s[front]->lch;}
            
          while(front!=rear&&((s[front]->lch!=NULL)||(s[front]->rch!=NULL)))\\判断后面是否全为空的叶子
             {
                 front++;
                 
             }
           
         if(rear==front)
           return 1;
         else
           return 0;
         
      }
}
main()
{   
    int i;
    i=panduan();
    if(i==1)
    printf("是完全二叉树");
    else
    printf("不是完全二叉树");
}

只能返回0.我找不到哪儿错了
学得不好请多指教
5 回复
#2
yuccn2012-12-16 15:35
struct node *creat(struct node *root) \\创建二叉树
哥哥,你的注释用错了 是//  不是\\
#3
惜缘03102012-12-16 23:43
那是我后加的,程序里没有,不重要,重要的是能不能帮我找出错哪儿了
#4
寒风中的细雨2012-12-18 13:12
回复 3楼 惜缘0310
简单的程序  写的有些复杂
#5
惜缘03102012-12-18 22:38
我知道有点复杂,可是当时这个想法直接出来了,我觉得 else
      {
           if((s[front]->lch!=NULL)&&(s[front]->rch=NULL))\\若左不为空右为空则左进队
              {s[++rear]=s[front]->lch;}
              
          while(front!=rear&&((s[front]->lch!=NULL)||(s[front]->rch!=NULL)))\\判断后面是否全为空的叶子
              {
                  front++;
                  
              }
            这里有错,但不知怎么改
#6
寒风中的细雨2012-12-19 09:41
回复 5楼 惜缘0310
单步调试  或是  加些调试日志  看看是那儿有问题


如果可以的话  还是建议 换种解题思路
1