这是我用来在BST中添加的代码,这是preorder函数,为什么会变成无穷大?我从用户那里输入要添加的元素,但是输出却变成了无穷大
void add(){
struct node* temp=(struct node *) malloc(sizeof(struct node));
struct node* current=root;
printf("\nEnter the data:\n");
scanf("%d",&temp->data);
while(current->left!=NULL && current->right!=NULL){
parent=current;
if(temp->data > parent->data){
current=current->right;
}
else{
current=current->left;
}
}
if(temp->data > parent->data){
parent->right=temp;
parent->left=NULL;
}
else{
parent->left=temp;
parent->right=temp;
}
}
void preorder(struct node* node)
{
if (node == NULL)
return;
/* first print data of node */
printf("%d ", node->data);
/* then recur on left subtree */
preorder(node->left);
/* now recur on right subtree */
preorder(node->right);
}
答案 0 :(得分:1)
函数add具有未定义的行为。
对于初学者,root最初可以等于NULL。所以您可能不使用这种方法
struct node* current=root;
//...
while(current->left!=NULL && current->right!=NULL){
因为尝试使用空指针访问内存。
第二个循环
while(current->left!=NULL && current->right!=NULL){
parent=current;
不处理仅包含一个不等于NULL的子节点的节点。
您还没有在创建的节点温度的左侧和右侧将数据成员设置为NULL。
这些陈述中有错字
parent->left=temp;
parent->right=temp;
因此函数定义无效。
该函数应该只做一件事:将一个节点附加到树上。它不应提示用户输入一些数据。
请注意,对于根节点使用全局变量是个坏主意。
尽管如此,这里还是一个使用您的方法的演示程序。我称这种方法为Java方法(在C中,函数add可以编写得更加简单)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct node
{
int data;
struct node *left, *right;
};
struct node *root;
_Bool add( int data )
{
struct node *new_node = malloc( sizeof( struct node ) );
_Bool success = new_node != NULL;
if ( success )
{
new_node->data = data;
new_node->left = NULL;
new_node->right = NULL;
if ( root == NULL )
{
root = new_node;
}
else
{
for ( struct node *current = root; ; )
{
struct node *parent = current;
if ( data < current->data )
{
current = current->left;
if ( current == NULL )
{
parent->left = new_node;
break;
}
}
else
{
current = current->right;
if ( current == NULL )
{
parent->right = new_node;
break;
}
}
}
}
}
return success;
}
void preorder( const struct node *node )
{
if ( node != NULL )
{
printf( "%d ", node->data );
preorder( node->left );
preorder( node->right );
}
}
int main(void)
{
srand( ( unsigned int )time( NULL ) );
const int N = 10;
for ( int i = 0; i < N; i++ ) add( rand() % N );
preorder( root );
putchar( '\n' );
return 0;
}
程序输出看起来像
4 0 3 2 1 0 1 2 5 8
下面有一个演示程序,该程序演示如何使用C方法编写函数add。在程序中,全局变量root被删除并替换为局部变量root。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct node
{
int data;
struct node *left, *right;
};
_Bool add( struct node **root, int data )
{
struct node *new_node = malloc( sizeof( struct node ) );
_Bool success = new_node != NULL;
if ( success )
{
new_node->data = data;
new_node->left = NULL;
new_node->right = NULL;
while ( *root != NULL )
{
if ( data < ( *root )->data ) root = &( *root )->left;
else root = &( *root )->right;
}
*root = new_node;
}
return success;
}
void preorder( const struct node *node )
{
if ( node != NULL )
{
printf( "%d ", node->data );
preorder( node->left );
preorder( node->right );
}
}
int main(void)
{
struct node *root = NULL;
srand( ( unsigned int )time( NULL ) );
const int N = 10;
for ( int i = 0; i < N; i++ ) add( &root, rand() % N );
preorder( root );
putchar( '\n' );
return 0;
}
现在研究并比较函数add的两种实现。
答案 1 :(得分:-1)
您必须以这种方式重写add方法,
void add()
{
int data;
printf("\nEnter the data:\n");
scanf("%d",data);
root = insert_rec(root, data);
}
struct node* insert_rec(struct node* current, int data)
{
if(current == NULL)
{
struct node* temp=(struct node *) malloc(sizeof(struct node));
temp->data = data;
current = temp;
return current;
}
else
{
if(current->data > data)
{
current->left = insert_rec(current->left, data);
}
else
{
current->right = insert_rec(current->right, data);
}
}
return current;
}
这是BST插入的递归方法。 希望这会有所帮助:)