| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1038 人关注过本帖
标题:请问计算叶子节点哪里出错了..
只看楼主 加入收藏
九亿少女的梦
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-4-9
结帖率:66.67%
收藏
已结贴  问题点数:5 回复次数:3 
请问计算叶子节点哪里出错了..
程序代码:
#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-14 12:09
marlow
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:125
专家分:419
注 册:2016-7-18
收藏
得分:5 
回复 楼主 九亿少女的梦
你计算叶结点的函数有问题,稍作改动如下:
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;
}

一切都在学习、尝试、摸索中
2017-04-14 21:32
九亿少女的梦
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-4-9
收藏
得分:0 
回复 2楼 marlow
谢谢 解决了..
请问计算总结点个数可以这样写吗
程序代码:
int  SumNodes(BiTree T)
{
    int sum,sum1,sum2;
    
    if(T==NULL) 
        sum=0;
    else 
    {
        sum=1;
        sum1=SumNodes(T->lchild) ;
        sum2=SumNodes(T->rchild) ;
        sum=sum1+sum2;
    } 
       return sum;    
    
} 
2017-04-15 09:03
marlow
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:125
专家分:419
注 册:2016-7-18
收藏
得分:0 
这样写也不对,删除sum=1;改动为sum=sum1+sum2+1;

一切都在学习、尝试、摸索中
2017-04-15 11:23
快速回复:请问计算叶子节点哪里出错了..
数据加载中...
 
   



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

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