BINARY SEARCH TREE创作

时间:2015-04-04 13:06:00

标签: c binary-search-tree

我编写了一个简单的代码来创建元素并将其插入到二叉搜索树中,当我以下面的方式编写代码时,链接似乎没有发生,任何人都可以帮助我理解究竟发生了什么。插入功能?我知道将元素插入二叉搜索树的代码,只是想知道为什么这个元素不起作用。

#include <stdio.h>
#include<stdlib.h>

struct node {
    struct node *left;
    struct node* right;
    int element;
};

void insert(struct node *node,int x) {
    if(node==NULL) {
        node=(struct node *)malloc(sizeof(struct node));
        node->element=x;
        node->left=NULL;
        node->right=NULL;
    } else {
        if(x<node->element) {
            insert(node->left,x);}
        else {
            insert(node->right,x);
        }
    }
}

void inorder(struct node *base) {
    if(base!=NULL) {
        inorder(base->left);
        printf("%d ",base->element);
        inorder(base->right);
    }
}


int main(int argc, char *argv[]) {
    struct node *base;
    base=(struct node *)malloc(sizeof(struct node));
    base->element=1;
    base->left=NULL;
    base->right=NULL;
    insert(base,25);
    insert(base,30);
    inorder(base);

    return 0;
}

如果以这种方式编写插入函数,它可以工作,但仍然不能用于创建二叉搜索树的第一个节点,混淆:/

void insert2(struct node *node,int x) {
    if(node==NULL) {
        node=(struct node *)malloc(sizeof(struct node));
        node->element=x;
        node->left=NULL;
        node->right=NULL;
    } else {
        if(x<node->element) {
            if(node->left==NULL) {
                node->left=(struct node *)malloc(sizeof(struct node));
                node->left->element=x;
                node->left->left=NULL;
                node->left->right=NULL;
            } else {
                insert2(node->left,x);
            }
        } else {
            if(node->right==NULL) {
                node->right=(struct node *)malloc(sizeof(struct node));
                node->right->element=x;
                node->right->left=NULL;
                node->right->right=NULL;
            } else {
                insert2(node->right,x);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

将值传递给C中的函数时,您使用的是传值。这意味着该值被复制到另一个变量中,该变量变为函数的本地变量。

void change(struct node *n) {
    n = 42;
}

int main(void) {
    change(NULL); // change can't change the value of NULL, can it?
}

现在看一下您的insert功能...假设我致电insert(NULL,42);,您认为insert是否正在尝试更改NULL?或者它是否尝试更改某个局部变量,main函数无法看到?

你知道还需要做什么......让你的insert函数使用你在评论中建议的额外级别的指针间接,或者从insert返回根节点这样您就可以将insert所做的更改传播到main中存储的数据结构中(使用赋值=运算符)。

答案 1 :(得分:1)

C是按值传递。当您将某些内容传递给函数的参数时,该函数会复制它。因此,当您将struct node pointer传递给insert函数时,C会复制该指针。

您在main中所做的是首先制作struct node* base

base --> struct node

当你致电insert(base, 25)时,C会复制一份基地。所以现在你的记忆中有这样的东西:

basecpy ---> [struct node] <--- base

所以在你的insert中,你实际上是在做

if(basecpy==NULL)
    {basecpy=(struct node *)malloc(sizeof(struct node));
    basecpy->element=x;
    basecpy->left=NULL;
    basecpy->right=NULL;}

根本不会改变base - 只会更改basecpy

这可以通过使用双指针来解决:

void insert(struct node **node, int x) {
    if (*node == NULL) {
        *node = malloc(sizeof(*node));
        (*node)->element=x;
        (*node)->left=NULL;
        (*node)->right=NULL;
    } else {
        if (x < (*node)->element) {
            insert(&((*node)->left), x);
        } else {
            insert(&((*node)->right), x);
        }
    }
}

然后使用它,传入base的地址

insert(&base, 25);

指针可能很棘手:)

ideone