我正在编写一个程序来遍历预建树。就节点数量,节点位置等而言,我对树结构一无所知,但我需要遍历所有节点并对节点的值求和。
节点定义为
struct node
{
int value;
node* left;
node* right;
}
我的递归函数如下:
int sumTheTreeValues(struct node* root)
{
int sum = root->value;
if(!root->left){
sum = sum + sumTheTreeValues(root->left);
}
else if(!root->right){
sum = sum + sumTheTreeValues(root->right);
}
return sum;
}
编译器不会抛出任何错误,但如果我尝试运行它,它就会崩溃而没有消息。只是为了完整性检查我打印了节点值以确保根不是null
。我有预感它可能与递归终止有关,但我不确定还有什么要补充,因为我正在检查null
个孩子。
答案 0 :(得分:2)
对于初学者来说,C中的结构必须声明为
struct node
{
int value;
struct node *left;
struct node *right;
};
此if语句中的条件
if(!root->left){
相当于
if( root->left == NULL ){
因此,当它们等于NULL时,对左右节点递归调用该函数。但是在函数内部,不会检查root
是否等于NULL
。因此该函数具有未定义的行为。
在if-else语句中包含左侧和右侧节点的函数调用也没有意义。
该功能可以通过以下方式定义
long long int sumTheTreeValues( struct node *root )
{
long long int sum = 0;
if ( root )
{
sum = root->value +
sumTheTreeValues( root->left ) +
sumTheTreeValues( root->right );
}
return sum;
}
或者喜欢
long long int sumTheTreeValues( struct node *root )
{
return root == NULL ? 0
: root->value + sumTheTreeValues( root->left )
+ sumTheTreeValues( root->right );
}
这是一个带有两个递归函数的演示程序。
#include <stdio.h>
#include <stdlib.h>
struct node
{
int value;
struct node *left;
struct node *right;
};
void insert( struct node **head, int value )
{
if ( *head == NULL )
{
*head = malloc( sizeof( struct node ) );
( *head )->value = value;
( *head )->left = NULL;
( *head )->right = NULL;
}
else if ( value < ( *head )->value )
{
insert( &( *head )->left, value );
}
else
{
insert( &( *head )->right, value );
}
}
long long int sumTheTreeValues( struct node *root )
{
return root == NULL ? 0
: root->value + sumTheTreeValues( root->left )
+ sumTheTreeValues( root->right );
}
int main(void)
{
struct node *head = NULL;
const int N = 10;
for ( int i = 1; i < N; i++ )
{
insert( &head, i );
}
printf( "%lld\n", sumTheTreeValues( head ) );
return 0;
}
它的输出是
45