C二进制搜索树插入不打印

时间:2014-02-28 01:40:11

标签: c search insert binary-search-tree

我有以下二进制搜索树代码: 编辑:更改代码使用指标值不变。

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

typedef struct BST BST;
struct BST {
    int data;
    struct BST* left;
    struct BST* right;
};

BST* bst = NULL;

void insert(BST *node, int num) {

    BST *tmp;
    if ((*node) == NULL){
        tmp = (BST*) malloc(sizeof(tmp));
        tmp->data = num;
        tmp->left = NULL;
        tmp->right = NULL;
        node = tmp;
    }
    else if (num < (*node)->left){
        insert((*node)->left, num);
    }
    else if (num >(*node)->right){
        insert((*node)->right);
    }
    return;

}

void search(BST *node, int num) {
    int depth = 0;
    if ((*node) == NULL){
        printf("Element not found");
    }
    else if (num = (*node)->data){
        printf("Depth of element in tree: %d\n", depth);
    }
    else if (num < (*node)->left){
        depth++;
        search((*node)->left, num);
    }
    else if (num >(*node)->right){
        depth++;
        search((*node)->right);
    }
    else
        return;
}

// Printing the elements of the tree - inorder traversal
void print(BST* bst) {
    if (bst == NULL) return;
    print(bst->left);
    printf("%d\n", bst->data);
    print(bst->right);
    return;
}

int main() {
    struct node* root = NULL;

    insert(root, 4);
    insert(root, 2);
    insert(root, 1);
    insert(root, 3);
    insert(root, 6);
    insert(root, 5);
    return 0;
}

当我运行并编译此代码时,我得不到答案,但也没有打印。这是我必须完成的任务的一部分。我得到了print()方法,所以我应该如何改变它。我猜它与我负责实现的insert方法有关。有没有产生产量的原因?

我想也许这与我最初设置为等于NULL的BST* bst点有关。我觉得我从来没有做过任何事情,但我不确定我该做什么。

我对C比较陌生,所以我可能错过了一些东西。

1 个答案:

答案 0 :(得分:1)

您的代码存在很多问题。让我们从(接近)顶部开始,然后继续努力。

BST* bst = NULL;

虽然对执行不是非常有害,但你根本不会使用它。

void insert(BST *node, int num) {

如果希望insert能够更改根指针,则需要传递根指针的地址,这意味着insert需要接收指向BST指针的指针,这将成为void insert(BST **node, int num)

    if ((*node) == NULL){

这实际上就像上面的更改已经发生一样 - 它试图取消引用node,然后将结果与NULL进行比较,只有*node是一个有意义的指针(要求node是指向指针的指针)。

        tmp = (BST*) malloc(sizeof(tmp));

我建议不要从malloc转换返回值。这样做可以/将阻止编译器在/忘记#include <stdlib.h>时向您发出警告,以便它知道它返回void *

我将稍微跳过一点:

void search(BST *node, int num) {
    int depth = 0;

在定义和增加depth时,您实际上从未使用它。

然后我们得到至少一个你从未看到任何输出的明显原因:

int main() {
    struct node* root = NULL;

    insert(root, 4);
    insert(root, 2);
    insert(root, 1);
    insert(root, 3);
    insert(root, 6);
    insert(root, 5);
    return 0;
}

虽然您已定义print来打印树中的项目,但您实际上从未调用它!当然,如果您更改insert以获取指针指针,则需要更改这些调用以传递root的地址,例如:insert(&root, 4);