| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10599 人关注过本帖
标题:统计二叉树中叶子结点个数的问题,
只看楼主 加入收藏
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
收藏
已结贴  问题点数:20 回复次数:10 
统计二叉树中叶子结点个数的问题,
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
    int data;
    struct Node *LChild;
    struct Node *RChild;
}BiTNode,*BiTree;

int Leaf_Count;

//先序遍历创建二叉树
void CreateBiTree(BiTree *bt)
{
    int ch;
    scanf("%d",&ch);
    if(ch==0)
        *bt=NULL;
    else
    {
        *bt=(BiTree)malloc(sizeof(BiTree));
        (*bt)->data=ch;
        CreateBiTree(&((*bt)->LChild));
        CreateBiTree(&((*bt)->RChild));
    }
}
//先序打印二叉树
void PreOrder(BiTree bt)
{
    if(bt)
    {
        printf("%d ",bt->data);
        PreOrder(bt->LChild);
        PreOrder(bt->RChild);
    }
}
//中序打印二叉树
void InOrder(BiTree bt)
{
    if(bt)
    {
        InOrder(bt->LChild);
        printf("%d ",bt->data);
        InOrder(bt->RChild);
    }
}
//后序打印二叉树
void PostOrder(BiTree bt)
{
    if(bt)
    {
        PostOrder(bt->LChild);
        PostOrder(bt->RChild);
        printf("%d ",bt->data);
    }
}
//先序输出二叉树的叶子结点
void Pre_Order(BiTree bt)
{
    if(bt)
    {
        if(bt->LChild==NULL&&bt->RChild==NULL)
            printf("%d ",bt->data);
        Pre_Order(bt->LChild);
        Pre_Order(bt->RChild);
    }
}
//输出叶子结点数目
void LeafCount(BiTree bt)
{
    if(bt)
    {
        LeafCount(bt->LChild);
        LeafCount(bt->RChild);
        if(bt->LChild==NULL&&bt->RChild==NULL)
            Leaf_Count++;
    }
}
//输出叶子结点数目
int Leaf(BiTree bt)
{
    int Leaf_Count;
    if(bt==NULL)
        Leaf_Count=0;
    else if(bt->LChild==NULL&&bt->RChild==NULL)
        Leaf_Count=1;
    else
        return Leaf(bt->LChild)+Leaf(bt->RChild);
}
int main()
{
    BiTree bt;
    int Leaf_Count=0;
    printf("先序序创建二叉树输入零结束输入\n");
    CreateBiTree(&bt);
   
    printf("先序打印二叉树\n");
    PreOrder(bt);
    printf("\n");

    printf("中序打印二叉树\n");
    InOrder(bt);
    printf("\n");

    printf("中序打印二叉树\n");
    PostOrder(bt);
    printf("\n");
   
    printf("输出二叉树中的叶子结点\n");
    Pre_Order(bt);
    printf("\n");
   
    printf("后序遍历输出叶子结点数目1.\n");
    Leaf_Count=0;
    LeafCount(bt);
    printf("%d",Leaf_Count);
    printf("\n");
   
    printf("后序遍历输出叶子结点数目2.\n");
    int num=Leaf(bt);
    printf("%d",num);
    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


为什么会是零,我调试的时候看的也不是0输出就为零了。

[此贴子已经被作者于2017-11-19 14:41编辑过]

搜索更多相关主题的帖子: 二叉树 子结点 int NULL printf 
2017-11-19 14:33
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
Leaf_Count局部变量与全局变量重名~然后有一种很无语的感觉~只能说试试修改Leaf_Count的变量名称或者是变量作用范围(囧,这情况我也不知道怎么改了,还得要楼楼自己动手试试)~

[此贴子已经被作者于2017-11-19 16:40编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-11-19 16:37
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 2楼 九转星河
int Leaf(BiTree bt)
{
    int Leaf__Count;
    if(bt==NULL)
        Leaf__Count=0;
    else if(bt->LChild==NULL&&bt->RChild==NULL)
        Leaf__Count=1;
    else
        return Leaf(bt->LChild)+Leaf(bt->RChild);
}

局部变量名称该过也不行
2017-11-19 16:42
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 花脸
最简单的改法是去掉main函数那个Left_Count,然后全局变量那个初始化为0~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-11-19 17:17
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
    int data;
    struct Node *LChild;
    struct Node *RChild;
}BiTNode,*BiTree;

int Leaf_Count=0;                                //******

//先序遍历创建二叉树
void CreateBiTree(BiTree *bt)
{
    int ch;
    scanf("%d",&ch);
    if(ch==0)
        *bt=NULL;
    else
    {
        *bt=(BiTree)malloc(sizeof(BiTree));
        (*bt)->data=ch;
        CreateBiTree(&((*bt)->LChild));
        CreateBiTree(&((*bt)->RChild));
    }
}
//先序打印二叉树
void PreOrder(BiTree bt)
{
    if(bt)
    {
        printf("%d ",bt->data);
        PreOrder(bt->LChild);
        PreOrder(bt->RChild);
    }
}
//中序打印二叉树
void InOrder(BiTree bt)
{
    if(bt)
    {
        InOrder(bt->LChild);
        printf("%d ",bt->data);
        InOrder(bt->RChild);
    }
}
//后序打印二叉树
void PostOrder(BiTree bt)
{
    if(bt)
    {
        PostOrder(bt->LChild);
        PostOrder(bt->RChild);
        printf("%d ",bt->data);
    }
}
//先序输出二叉树的叶子结点
void Pre_Order(BiTree bt)
{
    if(bt)
    {
        if(bt->LChild==NULL&&bt->RChild==NULL)
            printf("%d ",bt->data);
        Pre_Order(bt->LChild);
        Pre_Order(bt->RChild);
    }
}
//输出叶子结点数目
void LeafCount(BiTree bt)
{
    if(bt)
    {
        LeafCount(bt->LChild);
        LeafCount(bt->RChild);
        if(bt->LChild==NULL&&bt->RChild==NULL)
            Leaf_Count++;
    }
}
//输出叶子结点数目
int Leaf(BiTree bt)
{
    int Leaf_Count;
    if(bt==NULL)
        Leaf_Count=0;
    else if(bt->LChild==NULL&&bt->RChild==NULL)
        Leaf_Count=1;
    else
        return Leaf(bt->LChild)+Leaf(bt->RChild);
}
int main()
{
    BiTree bt;
    int Leaf_Count=0;
    printf("先序序创建二叉树输入零结束输入\n");
    CreateBiTree(&bt);
   
    printf("先序打印二叉树\n");
    PreOrder(bt);
    printf("\n");

    printf("中序打印二叉树\n");
    InOrder(bt);
    printf("\n");

    printf("中序打印二叉树\n");
    PostOrder(bt);
    printf("\n");
   
    printf("输出二叉树中的叶子结点\n");
    Pre_Order(bt);
    printf("\n");
   
    printf("后序遍历输出叶子结点数目1.\n");
    //Leaf_Count=0;                                                //*******
    LeafCount(bt);
    printf("%d",Leaf_Count);
    printf("\n");
   
    printf("后序遍历输出叶子结点数目2.\n");
    int num=Leaf(bt);
    printf("%d",num);
    return 0;
}
这样吗?
2017-11-19 17:40
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 花脸
嗯我试过可以正常输出~运行正常就不用问了吧~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-11-19 17:43
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 6楼 九转星河
图片附件: 游客没有浏览图片的权限,请 登录注册
我的为什么不可以啊。
2017-11-19 18:35
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:10 
回复 7楼 花脸
是的,的确不行。
程序代码:
void CreateBiTree(BiTree *bt)
{
    int ch;
    scanf("%d", &ch);
    if (ch == 0)
        *bt = NULL;
    else
    {
        *bt = (BiTree)malloc(sizeof(BiTNode));    //这里是BiTNode
        (*bt)->data = ch;              //再说一下,为什么原来写的的也可以,自定义结构体大小为sizeof(BiTNode)=4, sizeof(BiTree)=4即一个指针大大小
        CreateBiTree(&((*bt)->LChild));
        CreateBiTree(&((*bt)->RChild));
    }
}


程序代码:
int Leaf(BiTree bt)
{
    int Leaf_Count;
    if (bt == NULL)
        Leaf_Count = 0;
    else if (bt->LChild == NULL&&bt->RChild == NULL)
        Leaf_Count = 1;
    else
        return Leaf(bt->LChild) + Leaf(bt->RChild);
}

int num = Leaf(bt);  
自定义函数Leaf() return来return去最后返回的是什么? 你仔细想想


程序代码:
int Leaf(BiTree bt)
{
    //printf("~");
    //system("pause");
    int Leaf_Count;
    if (bt == NULL)
        return 0;
    else if (bt->LChild == NULL&&bt->RChild == NULL)
        return 1;
    else
        return Leaf(bt->LChild) + Leaf(bt->RChild);
}



程序代码:
int main()
{
    BiTree bt; 
    //int Leaf_Count = 0;                  //就去掉这个,覆盖了全局的重名变量
    printf("先序序创建二叉树输入零结束输入\n");
    CreateBiTree(&bt);


[此贴子已经被作者于2017-11-19 20:04编辑过]


早知做人那么辛苦!  当初不应该下凡
2017-11-19 20:02
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
int Leaf(BiTree bt)
{
    int Leaf_Count;
    if (bt == NULL)
        Leaf_Count = 0;
    else if (bt->LChild == NULL&&bt->RChild == NULL)
        Leaf_Count = 1;
    else
        return Leaf(bt->LChild) + Leaf(bt->RChild);
}

int num = Leaf(bt);  
自定义函数Leaf() return来return去最后返回的是什么? 你仔细想想

我感觉返回的是叶子节点的数目。
2017-11-19 20:39
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
那为什么得出来的结果不是理想结果呢?  所以返回的不是叶子节点的数组
返回的是未知数,
你可以自己测试下的, 由Leaf()这个函数得出来的结果,每次运行结果都不一样。
递归可以多练练,多看看,

早知做人那么辛苦!  当初不应该下凡
2017-11-19 20:59
快速回复:统计二叉树中叶子结点个数的问题,
数据加载中...
 
   



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

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