[此贴子已经被作者于2006-9-24 3:23:14编辑过]
[此贴子已经被作者于2006-9-24 3:23:14编辑过]
 2006-09-23 10:22
	    2006-09-23 10:22
   2006-09-23 10:24
	    2006-09-23 10:24
  [此贴子已经被作者于2006-9-23 11:10:29编辑过]

 2006-09-23 11:04
	    2006-09-23 11:04
  
 2006-09-23 12:45
	    2006-09-23 12:45
  我编写了下面的代码,不知对不对,高手指教……
算法思想:按层次遍历,先找出结点中左右孩子都没有的第一个结点,然后判断其后的结点是不是都没有左右孩子,如果是则返回0,是完全二叉树,否则不是完全二叉树。
typedef   struct  node {
          char    data;
          struct  node  *leftchile,*rightchile;
          }Bitree;
  
int  wanqutree(Bitree  *bt)
    {
      Bitree  *p;
      Bitree  *Q[MAXSIZE];            //定义队列,用于存取树结点的地址
      int    front,rear;
      if(bt==NULL)return;
      front=0;
      rear=0;
      Q[rear++]=bt;                       //初始化队列
      p=bt;
      while((front!=rear)&&(p->leftchile!=NULL)&&(p->rightchile!=NULL))
         {                          //此循环找到其左右孩子均为空的结点
           Q[rear++]=p->leftchile;
           Q[rear++]=p->rightchile;
           p=Q[front];
          }
      while(front!=rear)           //此循环判断上循环找到的结点以后的
          {                          结点其左右孩子是不是都为空,如果是
            p=Q[front++];            则返回0,此树是完全二叉树
            if((p->leftchile!=NULL)||(p->rightchile!=NULL))
               return  0;
          }
       return   1;                  //不是完全二叉树则返回1
      }     
  
           
[此贴子已经被作者于2006-9-24 3:18:47编辑过]

 2006-09-24 03:04
	    2006-09-24 03:04
  判断每个结点:当出现某个结点有右孩子而没有左孩子则结束返回0,或者第一次出现只有左孩子(或没有孩子)时,做个标记,以后如果碰到某个结点有孩子则结束返回0.上述两个都没有出现则返回1.
flag=0;
while(p!=NULL)
{
if(p->lchild==NULL&&p->rchild)
{
     return(0);
}
if(p->rchild==NULL)
{
   flag=1;
}
if(flag==1&&p->lchild!=NULL||p->rchild!=NULL)
{
     return(0);
}
...进队...
...改变p的值...
}
return(1);
}
/*自己的程序对不对,写个主函数测试就知道了,但根据楼主的思想,应该有疏漏,不是找第一个没有左右孩子的.假如前面有个只有右孩子的,此时就可以判断它不是完全二叉树.*/

 2006-09-24 10:05
	    2006-09-24 10:05
   2006-09-24 10:16
	    2006-09-24 10:16