为什么root在二进制树中始终为null

时间:2016-10-30 16:21:32

标签: c struct binary-tree

我正在尝试在二进制搜索树(BST)上实现插入操作。我有一个名为insertpush的函数。每当给一个值插入时,insert()函数是如果root是Null(最初)它将被插入。如果root不是null,则从insert()调用另一个函数push()来插入值。但是对于我来说,root始终保持为null。我使用了字符串"我在这里"检查,每次我尝试插入一个新的数据,这个字符串被打印。这就是我怎么知道root仍然是NULL。这背后的问题是什么?

#include<stdio.h>
struct node {

    int data;
    struct node* left;
    struct node *right;
};
void insert(struct node *root,int value);
void push(struct node *temp,struct node *newNode);
struct node *root;
int main(){
    root = NULL;
    int option,value;
    for(;;){
       printf("Please select an option from below : \n");
       printf("1 for insert\n");
       printf("2 for search\n");
       printf("please enter your option : ");
       scanf("%d",&option);
       printf("\n");
       switch(option){
           case 1:
               printf("you choose to insert\n");
               printf("input your value :");
               scanf("%d",&value);
               insert(root,value);
               printf("\n");
               break;
           default:
               break;

       }
    }
}

void insert(struct node *root,int value){
    struct node *newNode = (struct node*)malloc(sizeof(struct node));
    struct node *temp = (struct node*)malloc(sizeof(struct node));

    newNode->data = value;
    newNode->left = NULL;
    newNode->right = NULL;
    temp = root;
    if(root==NULL){
         printf("i am here");
         root = newNode;  // enter first node
    }else{

        push(temp,newNode);
    }
}
void push(struct node *temp,struct node *newNode){
    printf("others");
    if(temp==NULL){
         temp = newNode;
    }else{
         if(temp->data > newNode->data){
              push(temp->left,newNode);
         }else{
            push(temp->right,newNode);
         }
    }

}

1 个答案:

答案 0 :(得分:2)

该程序有两个名为root的变量。第一个是全局变量,另一个是函数insert的本地变量。这就是为什么全局变量无法在函数insert中更改。

您可以更改界面

struct node* insert(struct node *root,int value);

并使用该方式的功能:

root = insert(root,value);

存在若干其他方法来更改全局变量,例如使用该界面:

void insert(struct node **root,int value);