有关二叉树问题,希望有人指点下,谢谢

来源:互联网 发布:淘宝自动下架时间 编辑:程序博客网 时间:2024/04/30 10:23

#include"stdlib.h"    /* 存储分配头文件,或用"malloc.h" */
#include"stdio.h"     /* 标准I/O头文件 */
#define NULL 0
#define MAX 100                   
#define LENG sizeof(struct Bnode)  /* 确定结点所占空间的字节数 */
typedef char ElemType;          /* 抽象元素类型为char类型 */
typedef struct Bnode               /* Bnode为结点类型 */
{ char data;                  /* data为抽象元素类型 */
  struct Bnode *lchild, *rchild;  /* 为指针类型  */
 }Bnode,*Btree;
    
void creat_tree(Bnode **root)     /* root是指向指针的指针类型 */
{ /* 本算法递归生成二叉树 */
   ElemType ch;
   scanf("%c",&ch);                    /* 输入结点,字符型 */
   if (ch==' ') *root=NULL;          /* 生成空二叉树 */
   else                                 /* 生成非空二叉树 */
    { *root=(Bnode *)malloc(LENG);     /* 申请结点空间 */
      (*root)->data=ch;                /* 生成根结点 */
      (*root)->lchild=(*root)->rchild=NULL; /* 本行可省去 */
      creat_tree(&(*root)->lchild);    /* 递归生成左子树 */
      creat_tree(&(*root)->rchild);    /* 递归生成右子树 */
    }
}

void outtree(Bnode *q)
{
  if(q!=NULL){
 outtree(q->lchild);
 printf("%c",q->data);
    outtree(q->rchild);
 }
  else
    printf(" ");
}

 

int find(Btree q,int b)
{
  switch(b){
  case 0: /*求叶子数*/
   if(q==0) return 0;
   if(q->lchild ==0 && q->rchild ==0) return 1;
  case 1:  /*度为1的节点数*/
   if(q==0) return 0;
     if(q->lchild==0 || q->rchild==0) return 1;;
 case 2:  /*度为2的节点数*/
   if(q==0) return 0;
   if(!(q->lchild ==0 || q->rchild ==0)) return 1;
 }
  return (find(q->lchild,b)+find(q->rchild,b));
}


void main()
{
 Bnode *p;
 int a,b;
    creat_tree(&p);
 outtree(p);/*中序遍历递归*/
 printf("请输入你要查找的节点度数b=");
 scanf("%d",&b);
 if(b>2)
  printf("没有度为%d的节点,你输入有错!",b);
 else{
   a=find(p,b);
   printf("%d",a);}

 

在计算节点数的那个算法里..算叶子和度为1的节点数可以,但求度为3的节点数却不行。它在执行完   if(!(q->lchild ==0 || q->rchild ==0)) return 1;这句后,在执行下面的时候,它跳过了  return (find(q->lchild,b)+find(q->rchild,b));  使得结果只能是0和1。。望有大师能指点一下,,感激....

原创粉丝点击