如何统计二叉树的总节点数
How to count the total number of nodes in binary tree
我需要计算二叉树中的节点总数。当我执行这段代码时,现在出现了问题,它为节点总数提供了垃圾值。我程序的输出类似于 993814
。应该是 7
.
如何解决这个问题?
#include<stdlib.h>
#include<stdio.h>
struct binarytree
{
int data;
struct binarytree * right, * left;
};
typedef struct binarytree node;
void insert(node ** tree, int val)
{
node *temp = NULL;
if(!(*tree))
{
temp = (node *)malloc(sizeof(node));
temp->left = temp->right = NULL;
temp->data = val;
*tree = temp;
return;
}
if(val < (*tree)->data)
{
insert(&(*tree)->left, val);
}
else if(val > (*tree)->data)
{
insert(&(*tree)->right, val);
}
}
void print_preorder(node * tree)
{
if (tree)
{
printf("%d\n",tree->data);
print_preorder(tree->left);
print_preorder(tree->right);
}
}
void print_inorder(node * tree)
{
if (tree)
{
print_inorder(tree->left);
printf("%d\n",tree->data);
print_inorder(tree->right);
}
}
int count(node *tree)
{
int c=0;
if (tree ==NULL)
return 0;
else
{
c += count(tree->left);
c += count(tree->right);
return c;
}
}
void print_postorder(node * tree)
{
if (tree)
{
print_postorder(tree->left);
print_postorder(tree->right);
printf("%d\n",tree->data);
}
}
int main()
{
node *root;
node *tmp;
int c;
root = NULL;
/* Inserting nodes into tree */
insert(&root, 9);
insert(&root, 10);
insert(&root, 15);
insert(&root, 6);
insert(&root, 12);
insert(&root, 17);
insert(&root, 2);
/* Printing nodes of tree */
printf("Pre Order Display\n");
print_preorder(root);
printf("In Order Display\n");
print_inorder(root);
printf("Post Order Display\n");
print_postorder(root);
printf("Number of node %d \n",c);
}
您声明了 c
但没有在任何地方初始化,也没有在任何地方使用。
然后你打印 c
的值,它给你垃圾值。
您可以将 count(node *tree)
函数修复为
int count(node *tree)
{
int c = 1; //Node itself should be counted
if (tree ==NULL)
return 0;
else
{
c += count(tree->left);
c += count(tree->right);
return c;
}
}
加入main
int main()
{
.............
.............
c = count(root); //number of node assign to c
printf("Number of node %d \n",c);
}
我宁愿在不使用局部变量的情况下在每次递归调用中返回总和。
int count(struct node *root){
if(root == NULL){
return 0;
}
else{
return 1 + count(root->left) + count(root->right);
}
}
count
函数将是
int count(struct node *root)
{
int a=1;
if (root==NULL){
return 0;
}
else
{
a += count(root->left);
a += count(root->right);
return a;
}
}
在main函数中,count
函数的调用是这样的
printf("total no of nodes of binary tree is %d\n",count(p));//p is root node
我需要计算二叉树中的节点总数。当我执行这段代码时,现在出现了问题,它为节点总数提供了垃圾值。我程序的输出类似于 993814
。应该是 7
.
如何解决这个问题?
#include<stdlib.h>
#include<stdio.h>
struct binarytree
{
int data;
struct binarytree * right, * left;
};
typedef struct binarytree node;
void insert(node ** tree, int val)
{
node *temp = NULL;
if(!(*tree))
{
temp = (node *)malloc(sizeof(node));
temp->left = temp->right = NULL;
temp->data = val;
*tree = temp;
return;
}
if(val < (*tree)->data)
{
insert(&(*tree)->left, val);
}
else if(val > (*tree)->data)
{
insert(&(*tree)->right, val);
}
}
void print_preorder(node * tree)
{
if (tree)
{
printf("%d\n",tree->data);
print_preorder(tree->left);
print_preorder(tree->right);
}
}
void print_inorder(node * tree)
{
if (tree)
{
print_inorder(tree->left);
printf("%d\n",tree->data);
print_inorder(tree->right);
}
}
int count(node *tree)
{
int c=0;
if (tree ==NULL)
return 0;
else
{
c += count(tree->left);
c += count(tree->right);
return c;
}
}
void print_postorder(node * tree)
{
if (tree)
{
print_postorder(tree->left);
print_postorder(tree->right);
printf("%d\n",tree->data);
}
}
int main()
{
node *root;
node *tmp;
int c;
root = NULL;
/* Inserting nodes into tree */
insert(&root, 9);
insert(&root, 10);
insert(&root, 15);
insert(&root, 6);
insert(&root, 12);
insert(&root, 17);
insert(&root, 2);
/* Printing nodes of tree */
printf("Pre Order Display\n");
print_preorder(root);
printf("In Order Display\n");
print_inorder(root);
printf("Post Order Display\n");
print_postorder(root);
printf("Number of node %d \n",c);
}
您声明了 c
但没有在任何地方初始化,也没有在任何地方使用。
然后你打印 c
的值,它给你垃圾值。
您可以将 count(node *tree)
函数修复为
int count(node *tree)
{
int c = 1; //Node itself should be counted
if (tree ==NULL)
return 0;
else
{
c += count(tree->left);
c += count(tree->right);
return c;
}
}
加入main
int main()
{
.............
.............
c = count(root); //number of node assign to c
printf("Number of node %d \n",c);
}
我宁愿在不使用局部变量的情况下在每次递归调用中返回总和。
int count(struct node *root){
if(root == NULL){
return 0;
}
else{
return 1 + count(root->left) + count(root->right);
}
}
count
函数将是
int count(struct node *root)
{
int a=1;
if (root==NULL){
return 0;
}
else
{
a += count(root->left);
a += count(root->right);
return a;
}
}
在main函数中,count
函数的调用是这样的
printf("total no of nodes of binary tree is %d\n",count(p));//p is root node