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

请问计算叶子结点个数的时候哪里出错了

九亿少女的梦 发布于 2017-04-13 20:56, 2068 次点击
程序代码:
#include<malloc.h>

 #include<stdio.h>

 #include<stdlib.h>

 #include<math.h>

typedef char DataType;
typedef struct node{
    DataType data;
    struct node *lchild,*rchild;
}BiTNode;
typedef BiTNode *BiTree;


void CreateBiTree(BiTree &T){
    char ch;ch=getchar();
   
    if(ch==' ')
        T=NULL;
    else{
        T=(BiTNode*)malloc(sizeof(BiTNode));
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
   
}

void visit(char e){
    if(e!=NULL)
        // 以整型格式输出
        printf("%c ",e);


}
int PreOrderTraverse(BiTree T,void(*Visit)(char e))

 { // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算法6.1
   
// 操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次
     if(T!=NULL) // T不空
     {
         Visit(T->data); // 先访问根结点
         PreOrderTraverse(T->lchild,Visit); // 再先序遍历左子树
         PreOrderTraverse(T->rchild,Visit); // 最后先序遍历右子树

     } return 0;

 }
void InOrderTraverse(BiTree T,void(*Visit)(char e))

 { // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
   
// 操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次

     if(T!=NULL)
     {
         InOrderTraverse(T->lchild,Visit); // 先中序遍历左子树
         Visit(T->data); // 再访问根结点  
         InOrderTraverse(T->rchild,Visit); // 最后中序遍历右子树
     };

 }
  void PostOrderTraverse(BiTree T,void(*Visit)(char e))

 { // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
   
// 操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次
   
      if(T!=NULL) // T不空
      {
          PostOrderTraverse(T->lchild,Visit); // 先后序遍历左子树   
          PostOrderTraverse(T->rchild,Visit); // 再后序遍历右子树
          Visit(T->data); // 最后访问根结点
      }

 }

 





int  LeafNodes(BiTree T)
{
      int  num, num1, num2;
      if(T==NULL)
      {
         num+=0;
      }
      else if((T->lchild=NULL)&&(T->rchild==NULL))
          num+=1;
      else
      {
          num1 = LeafNodes(T->lchild);
          num2 = LeafNodes(T->rchild);
         
         
      }
      num=num1+num2;
     return num;
}

  void main()

 {
   
    int num;
      BiTree T;
      printf("按先序次序输入二叉树中结点的值,输入空格表示节点为空\n");
      CreateBiTree(T); // 建立二叉树T
      printf("先序递归遍历二叉树:\n");
      PreOrderTraverse(T,visit); // 先序递归遍历二叉树T
      printf("\n中序递归遍历二叉树:\n");   
      InOrderTraverse(T,visit); // 中序递归遍历二叉树T
      printf("\n后序递归遍历二叉树:\n");
      PostOrderTraverse(T,visit); // 后序递归遍历二叉树T
      printf("\n计算叶子节点个数:");
      num=LeafNodes(T);
      printf("%d",num);
      printf("\n计算结点总数:");
      printf("%d",num+1);


 }
1 回复
#2
书生牛犊2017-04-17 07:13
程序代码:
int  LeafNodes(BiTree T)
{
      int  num, num1, num2;
      if(T==NULL)
      {
         num+=0;
      }
      else if((T->lchild=NULL)&&(T->rchild==NULL))
          num+=1;
      else
      {
          num1 = LeafNodes(T->lchild);
          num2 = LeafNodes(T->rchild);
         
         
      }
      num=num1+num2;
     return num;
}


你能告诉我,num1,num2的初始值是多少吗?未初始化,所以不能!
我给一个我自己的思路你看看
程序代码:
int  LeafNodes(BiTree T)
{
      if(T==NULL)/*如果传进来的树为NULL,直接返回0.*/
      {
         return 0;
      }

     if((T->lchild=NULL)&&(T->rchild==NULL))/*如果当下访问到的已经是叶节点了,我们也不必继续去访问它的两个子节点,也可以直接跳回上一层了*/
      {
         return 1;
      }

return LeafNodes(T->lchild)+LeafNodes(T->rchild);
           
}




1