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

标签 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() 方法,所以我应该如何改变它。我猜这与我负责实现的插入方法有关。关于为什么没有产生输出的任何这样的原因?

我在想这可能与我最初设置为 NULL 的 BST* bst 点有关。我觉得我从来没有用它做任何事情,但我不确定我必须做什么。

我是 C 的新手,所以我可能错过了一些东西。

最佳答案

您的代码有不少问题。让我们从(接近)顶部开始,一路向下。

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);

关于C 二进制搜索树插入不打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22084503/

相关文章:

c - 为什么-~x等于x+1?

c - 如何添加两个字符串?

search - PDF文本搜索和拆分库

python - 仅更新 python 最后一条记录

javascript - 无法访问 jQuery 插入的元素

c - gcc 优化跳过初始化分配的内存

c - scanf 和 printf 中的无效 int

arrays - 难以理解指数搜索的工作原理

javascript - 是否有一种搜索算法可以一直搜索有序列表,直到所有值都相等?

javascript - 添加其上方的类,例如将类 "act"添加到 "<ul>"上方的 "li.item1"