| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1940 人关注过本帖
标题:请问计算叶子结点个数的时候哪里出错了
只看楼主 加入收藏
九亿少女的梦
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-4-9
结帖率:66.67%
收藏
 问题点数:0 回复次数:1 
请问计算叶子结点个数的时候哪里出错了
程序代码:
 #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);


 }
2017-04-13 20:56
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
程序代码:
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);
           
} 





φ(゜▽゜*)♪
2017-04-17 07:13
快速回复:请问计算叶子结点个数的时候哪里出错了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036878 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved