二进制搜索树插入 - root始终为null

时间:2014-02-01 07:40:54

标签: c binary-search-tree insertion

我有ds代码,用于使用递归在二叉搜索树中插入值。问题是root始终保持为null。 执行时,第一个printf()打印10,但第二个printf(在insertRec(10)之后)不打印任何内容,因为root为null。

#include<stdio.h>
#include<malloc.h>

struct llist
{
       int data;           
      struct llist *left;
      struct llist *right;       
};
typedef struct llist node;

void insertRec(node *r, int num)
{   
     if(r==NULL)
     {      
             r=(node*)malloc(sizeof(node)); 
             r->data=num; 
             r->left=NULL; 
             r->right=NULL; printf("%d ",r->data); //1st printf

     }     
     else
     {
         if(num < r->data)
           insertRec(r->left, num);             
         else
           insertRec(r->right, num);                 
     }         
}    
void display(node *x)
{          
     if(x != NULL)
     {
       display(x->left);
       printf("%d-->",x->data);
       display(x->right);        
     }
     else 
     return;              
}
int main()
{  
    node *root=NULL; 
        insertRec(root,10);  
        if(root !=NULL)  
            printf("\ndata=%d",root->data); //2nd printf
        insertRec(root,5);
        insertRec(root,15);
        insertRec(root,3);
        insertRec(root,18); 
        display(root);
        getch();
}

1 个答案:

答案 0 :(得分:2)

您正在传递root作为值,因此对插入函数中的root所做的更改不会反映在main函数中,因此root在main函数中保持为NULL。要纠正您的代码,请need to pass Pointer to pointer。传递root的地址以反映主要功能的变化。

void insertRec(node *r, int num)

应编码如下:

void insertRec(node **r, int num)
{
    if(*r==NULL)
    {      
         *r= malloc(sizeof(node)); 
         (*r)->data=num; 

 // 

并在插入函数中使用*root

从main中将其称为insertRec(&root, 10);

此外,如果您动态分配内存,那么您应该使用free显式释放已分配的内存。

还有一件事要学习Indenting C Programs