求二叉树结点个数

kanwolf 2010-08-13 09:28:05
我这样求二叉树结点算法有错吗?得不到正确答案
其中head为二叉树的根结点
int nodecount(nodey *head)
{
nodey *bt=head;
int num,num1,num2;

if(bt==NULL)
return 0;
else
{
num1=nodecount(bt->lchild);
num2=nodecount(bt->rchild);
num=num1+num2+1;
return num;
}
}
...全文
2000 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Polyglot_g 2010-08-16
  • 打赏
  • 举报
回复
楼主:我用了一下你的函数,感觉这个函数好使呀:输入 1 2 4 5 0 0 0 0 3 6 0 0 0 输出节点的数目是6
感觉是你的树没建好。下面是我建的树和你的代码。。
#include<iostream>
using namespace std;

struct BTree{

char node;
BTree *lchild;
BTree *rchild;
};

void CreatT(BTree **orange)
{
char word='0';
cout<<"input the word and 0 means leaf: "<<endl;
cin>>word;
if(word=='0') *orange=NULL;
else{

*orange=(BTree *)malloc(sizeof(BTree)*1);
(*orange)->node=word;
CreatT(&((*orange)->lchild));
CreatT(&((*orange)->rchild));
}
}

void show(BTree *apple)
{
if(apple==NULL)return;
else
{
cout<<(apple->node)<<endl;
show(apple->lchild);
show(apple->rchild);
}
}



int nodecount(BTree *head)
{
BTree *bt=head;
int num=0,num1=0,num2=0;

if(bt==NULL)
return 0;
else
{
num1=nodecount(bt->lchild);
num2=nodecount(bt->rchild);
num=num1+num2+1;
return num;
}
}

int main()
{
BTree *mm=NULL;
CreatT(&mm);
cout<<"the tree is:"<<endl;
show(mm);

int count;
count=nodecount(mm);
cout<<"the number of the node is :";
cout<<count<<endl;
return 0;


}
longxibendi 2010-08-16
  • 打赏
  • 举报
回复
每一次递归,都把num,num1,num2赋值为0,结果应该是0吧.

需要定义成静态局部变量吧。严重同意11楼。
yoxibaga 2010-08-16
  • 打赏
  • 举报
回复
树的结构是递归定义了,所以,用递归是很显然的方法。。。
当然,递归基本就可以转换为栈的处理。
goodluckme2013 2010-08-16
  • 打赏
  • 举报
回复
楼主思路错误,应该用栈操作!这样递归是实现不了的!
东大坡居士 2010-08-16
  • 打赏
  • 举报
回复
no problem````````````
maoxing63570 2010-08-16
  • 打赏
  • 举报
回复
你通过一趟遍历可以遍历到所有的节点,那么这个说明说明呢?说明所有的顶点都访问到了,那么如果你采用的遍历方式是递归的(比如先序遍历),那么你只需要在先序遍历的那个遍历函数中定义一个局部的静态变量用作计数,然后每打印一个节点的时候,就自加那个静态变量,遍历完后打印那个静态变量的值就知道了,至于为什么要定义成静态的,这个是楼主你语言基础的问题,我就不做解释了。
yoxibaga 2010-08-16
  • 打赏
  • 举报
回复
楼主的这个算法正确,没有错误,你看看你构建树正确否。。。
2楼的代码更好。。
canshui 2010-08-16
  • 打赏
  • 举报
回复
我也没说用我的!

这个是楼主你语言基础的问题,我就不做解释了。

你能委婉点不?
maoxing63570 2010-08-16
  • 打赏
  • 举报
回复
晕死,可以你就照你的去做,我没说一定要按照我说的那个去做
boliang319 2010-08-16
  • 打赏
  • 举报
回复
楼主的代码和算法都没问题,如果树本身没问题的话,就是正确的。
建议楼主检查一下输入的树是否有问题。
DayDayUpCQ 2010-08-16
  • 打赏
  • 举报
回复
我计算的结果怎么是正确的呢?楼主能把你计算的二叉树的数字序列发出来看一下呢?

#include<stdio.h>
#include<stdlib.h>

typedef struct Bin_Tree_Node{

struct Bin_Tree_Node *left_child;
struct Bin_Tree_Node *right_child;
int data;
}Bin_Tree_Node;

//将输入的序列按照二叉树的先序遍历创建二叉树
void CreateBinTree( Bin_Tree_Node **p_root )
{
static int input_data;
scanf("%d", &input_data );

if( input_data == -1 )
{
(*p_root) = NULL;
return;
}
else
{
(*p_root) = (Bin_Tree_Node *)malloc( sizeof(Bin_Tree_Node) );
(*p_root)->data = input_data;
CreateBinTree( &(*p_root)->left_child );
CreateBinTree( &(*p_root)->right_child );
}
}

//求二叉树中节点的个数
int BinTreeNodeCount( Bin_Tree_Node *root )
{
int num, num1, num2;

if( root==NULL )
{
return 0;
}
else
{
num1 = BinTreeNodeCount( root->left_child );
num2 = BinTreeNodeCount( root->right_child );
num = num1 + num2 + 1;
return num;
}
}

int main()
{
Bin_Tree_Node *root;
int node_num;

CreateBinTree( &root );
node_num = BinTreeNodeCount( root );
printf("\nnumber of node: %d \n", node_num );
system("pause");
return 0;
}

当输入 1 2 4 -1 -1 5 6 -1 -1 -1 -1 输出结果为5

不过递归函数都是单入口单出口的,还是觉得2楼的写法比较好。
canshui 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 maoxing63570 的回复:]
你通过一趟遍历可以遍历到所有的节点,那么这个说明说明呢?说明所有的顶点都访问到了,那么如果你采用的遍历方式是递归的(比如先序遍历),那么你只需要在先序遍历的那个遍历函数中定义一个局部的静态变量用作计数,然后每打印一个节点的时候,就自加那个静态变量,遍历完后打印那个静态变量的值就知道了,至于为什么要定义成静态的,这个是楼主你语言基础的问题,我就不做解释了。
[/Quote]

你虽然学的非常非常好! 你也没有必要总是以这种居高临下的态度回帖吧!定义成静态变量,不定义成,要样可以解决问题!
kostion 2010-08-15
  • 打赏
  • 举报
回复
一个遍历
cswhale 2010-08-15
  • 打赏
  • 举报
回复
这应该是先序遍历吧,我看可以
nodecount()方法要自己编的话,我觉得用if判断简单些,如下:

if(bt->lchild)
{
num++;
}
可以避免值传递可能造成的错误
lljyx1984 2010-08-15
  • 打赏
  • 举报
回复
int num,num1,num2;
这几个没有初始化吧
艾莎云 2010-08-15
  • 打赏
  • 举报
回复
左右孩子 没有定义指针 结构体内部使用 系统无法正常调用……
swl82560397pq 2010-08-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 kanwolf 的回复:]
我这样求二叉树结点算法有错吗?得不到正确答案
其中head为二叉树的根结点
int nodecount(nodey *head)
{
nodey *bt=head;
int num,num1,num2;

if(bt==NULL)
return 0;
else
{
num1=nodecount(bt->lchild);
num2=nodecount(bt->rchild);……
[/Quote]

if(bt==NULL)是否置了最底层的为NULL呢?
zcyay 2010-08-15
  • 打赏
  • 举报
回复
感觉没问题吧 是不是二叉树建立有问题 最后叶子节点没加空
canshui 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 kanwolf 的回复:]
我这样求二叉树结点算法有错吗?得不到正确答案
其中head为二叉树的根结点
int nodecount(nodey *head)
{
nodey *bt=head;
int num,num1,num2;

if(bt==NULL)
return 0;
else
{
num1=nodecount(bt->lchild);
num2=nodecount(bt->rchild);……
[/Quote]
你这个 的话, 单步调试下吧
canshui 2010-08-13
  • 打赏
  • 举报
回复
你参照下这个

main()
{
int num=0 ; //计数
…………
Node_Num(T, &num);
}
void Node_Num(BT T, int *num)
{
if(T) {
(*num)++ ;
Node_Num(T->lchild, num) ;
Node_Num(T->rchild, num) ;
} else
return ;
}

69,378

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧