为什么我的BST中没有插入任何元素

时间:2016-11-01 17:13:28

标签: c binary-tree

这里我试图实现一个二叉搜索树。我在全局上下文中声明了根节点。我遵循了相同的想法,我是如何实现链表的。但是这种方法看起来并不像是在工作。我可以'我想这个代码有什么问题。任何人都可以帮我解决这个问题

#include<stdio.h>
struct node {

    int data;
    struct node *left;
    struct node *right;
};
void insert(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(value);
               printf("\n");
               break;
           case 2:
               printf("You choose to search\n");
               printf("enter your value : ");
               scanf("%d",&value);
               search(root,value);
               printf("\n");
           default:
               break;

       }
    }
}

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

    newNode->data = value;
    newNode->left = NULL;
    newNode->right = NULL;


    push(root,newNode);

}
void push(struct node *root_node,struct node *newNode){

  if(root_node==NULL){
         root_node = newNode;
         printf("inserted\n\n\n");
    }else{
         if(root_node->data > newNode->data){
              push(root_node->left,newNode);
              printf("left\n");
         }else{
            push(root_node->right,newNode);
            printf("right\n");
         }

    }

}

2 个答案:

答案 0 :(得分:3)

push()中,root_node是本地变量

void push(struct node *root_node,struct node *newNode){

当你这样做时:

root_node = newNode;

您只更新本地变量“root_node”,而不是全局变量:

struct node *root;

你的推()应该是这样的:

void push(struct node **root_node,struct node *newNode){
    if(*root_node==NULL){
        *root_node = newNode;
        printf("inserted\n\n\n");
    }else{
...

并致电:

push(&root, newNode);

通过这种方式,您传递root的地址,并在其中检查该地址所指向的是否为NULL。如果为null,则将newNode的地址分配给指针dereferenced

更多解释:

struct node *root是一个指针:一个变量,其类型是“指针/地址”。并指向数据存储器中的一个块,让我们称之为“A”。

struct node *root_node是一个指针,作为局部变量,它是一个 COPY ,它指向数据内存中的一个块,在你的情况下(因为你传递“root”)指向“A”。

修改root_node后,您的副本不会修改root。你在做什么只能用来修改“A”。

你必须传递root的 地址 ,这样你才能真正修改root的值,这是一个指向“A”的指针。以这种方式,你有** root_node,它指向root,ACTUAL root,指向“A”,你可以指向其他地方(如你所愿)。 / p>

我上传图片以说明您的解决方案错误的原因:

enter image description here

如您所见,root 从未更新。

(P.S。:您可以将“复制指针”视为“复制变量”,因为指针是一个变量,其值是一个地址。并且您使用*variable取消引用地址。

答案 1 :(得分:0)

以下行是 NOT 更新全局变量root

    push(root,newNode);

}
void push(struct node *root_node,struct node *newNode){

  if(root_node==NULL){
         root_node = newNode;
         printf("inserted\n\n\n");

由于您希望root是全局的,因此可以通过以下方式更改此选项,以便使用全局root

    push(newNode);

}
void push(struct node *newNode){

  if(root == NULL){
         root = newNode;
         printf("inserted\n\n\n");

等等。 (注意:这不是一个完整的解决方案。)