我有以下二进制搜索树代码: 编辑:更改代码使用指标值不变。
#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比较陌生,所以我可能错过了一些东西。
答案 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);