礼貌求助,二叉树
#include <stdio.h>#include <stdlib.h>
typedef char Elemtype;
typedef struct BiTreeNode
{
char data;
struct BiTreeNode *lchild,*rchild;
}BiTreeNode, *BiTree;
//创建二叉树
void CreateBiTree(BiTree &T)
{
char c;
scanf("%c",&c);
if('#'== c)
{
T = NULL;
}
else
{
T = (BiTreeNode *)malloc (sizeof(BiTreeNode));
T->data = c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//访问二叉树结点
void visit(char c, int level)
{
printf("%c 在第 %d 层\n",c,level);
}
//前序遍历二叉树
void PreOrder(BiTree T,int level)
{
if(T)
{
visit(T->data,level);
PreOrder(T->lchild,level+1);
PreOrder(T->rchild,level+1);
}
}
//求叶子结点个数
void Number(BiTree T,int count)
{
if(T)
{
if(T->lchild == NULL && T->rchild ==NULL)
{
count++;
Number(T->lchild,count);
Number(T->rchild,count);
}
}
}
int main(void)
{
int level = 1;
int count = 0;
BiTree T;
CreateBiTree(T);
printf("前序遍历二叉树:\n");
PreOrder(T,level);
Number(T,count);
printf("二叉树叶子结点个数:%d\n",count);
getchar();
getchar();
getchar();
return 0;
}
这里的count输出一直是0,然后我改动了代码:
intNumber(BiTree T,int count)
{
if(T)
{
if(T->lchild == NULL && T->rchild ==NULL)
{
count++;
Number(T->lchild,count);
Number(T->rchild,count);
}
}
return count;
}
main函数里是count = Number(T,count);这样还是0,不知道是哪里出错了,我们老师说计数器要用应用型参数,&count。但是我不太明白代码要怎么改动 你这个有两种修改方式
一种是按照你老师说的,实际上就是把值传递改为址传递,也就是在函数Number中修改count直接修改的就是主函数中的count,这样也不用有什么返回值了
//Number函数实现过程如下
voidNumber(BiTree T,int *count)
{
if(T)
{
if(T->lchild == NULL && T->rchild ==NULL)
{
(*count)++;
Number(T->lchild,count);
Number(T->rchild,count);
}
}
}
//主函数中的调用如下:
Number(T,&count);
另外一种就是,调用Number函数时不传递参数count,让其作为返回值传回主函数
//Number函数实现过程如下
intNumber(BiTree T)
{
int count=0;
if(T)
{
if(T->lchild == NULL && T->rchild ==NULL)
{
count++;
count+=Number(T->lchild);
count+=Number(T->rchild);
}
}
return count;
}
//主函数中的调用如下:
count=Number(T);
以上是在你的函数基础上帮你修改的。
但是我怎么感觉你的函数最大的问题不是语法问题而是逻辑问题呢
你自己在看一下逻辑问题
Number函数是为了统计叶子节点数吧?
那为什么是当T->lchild == NULL && T->rchild ==NULL进行统计呢?
难道不应该是有节点的时候进行统计吗?
我没有仔细看你的完整程序,片面理解,不知是否正确
sunrise085 发表于 2020-3-27 09:17
你这个有两种修改方式
一种是按照你老师说的,实际上就是把值传递改为址传递,也就是在函数Number中修改co ...
我想的是统计叶子节点数,当它的左右子树都为空,计数器就加一。在这个小子树里面,只有根结点,没有左右子树 wangyuans 发表于 2020-3-27 10:44
我想的是统计叶子节点数,当它的左右子树都为空,计数器就加一。在这个小子树里面,只有根结点,没有左右 ...
哦哦,明白了,你是只统计叶子。
那么问题来了
if(T->lchild == NULL && T->rchild ==NULL)
{
count++;
count+=Number(T->lchild);
count+=Number(T->rchild);
}
既然T->lchild == NULL,那么还有必要去调用Number(T->lchild)吗?
我认为应该是当该节点不是叶节点的时候才去进行递归调用吧?
不知道我有没有想错
//Number函数实现过程如下
intNumber(BiTree T)
{
int count=0;
if(T)
{
if(T->lchild == NULL && T->rchild ==NULL)
count++;
else
{
if (T->lchild)
count+=Number(T->lchild);
if (T->rchild)
count+=Number(T->rchild);
}
}
return count;
}
//主函数中的调用如下:
count=Number(T); sunrise085 发表于 2020-3-27 09:17
你这个有两种修改方式
一种是按照你老师说的,实际上就是把值传递改为址传递,也就是在函数Number中修改co ...
我还是调不通这个程序,应该就是你说有逻辑问题那个地方出错了,好迷茫呀 sunrise085 发表于 2020-3-27 10:57
哦哦,明白了,你是只统计叶子。
那么问题来了
void Number(BiTree T,int &count)
{
if(T)
{
if(T->lchild == NULL && T->rchild ==NULL)
{
count++;
}else
{
Number(T->lchild,count);
Number(T->rchild,count);
}
}
}
这样就调通了,太感谢你了
页:
[1]