我有以下二叉搜索树代码: 编辑:更改代码以使用指针而不是值。
#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/