我正在阅读《C 语言问题解决和程序设计》一书来学习 C。在这本书中,他们提供了构建二叉搜索树的所有必要部分...... 但是,我的实现没有成功。这是插入部分;
void
add_to_t(tree_node_t *oldTreep, // input/output - binary search tree
tree_element_t ele) // input - element to add
{
oldTreep = tree_insert(oldTreep, ele);
}
tree_node_t * tree_insert(tree_node_t *oldTreep, tree_element_t ele)
{
if(oldTreep == NULL){
oldTreep = TYPED_ALLOC(tree_node_t);
strcpy(oldTreep->element.name, ele.name);
strcpy(oldTreep->element.sName, ele.sName);
oldTreep->element.seatClass = ele.seatClass;
oldTreep->leftp = NULL;
oldTreep->rightp = NULL;
}
else if (strcmp(oldTreep->element.name, ele.name)==0){
/* duplicate key - no insertion */
}
else if (strcmp(oldTreep->element.name, ele.name)>0){
oldTreep->rightp = tree_insert(oldTreep->rightp, ele);
}
else
{
oldTreep->leftp = tree_insert(oldTreep->leftp, ele);
}
return(oldTreep);
}
我的 scan_passenger 函数(我正在从该函数调用的结果传递 ele);
void scan_passenger(tree_element_t *pass)
{
char passName[10], passSname[10];
int classNum;
printf("\nEnter the Name of passenger to add the binary search tree> ");
scanf("%s", passName);
printf("Enter the Surname of passenger to add the binary search tree> ");
scanf("%s", passSname);
printf("Enter the class number of passenger to add the binary search tree> ");
scanf("%d", &classNum);
strcpy(pass->name, passName);
strcpy(pass->sName, passSname);
pass->seatClass = classNum;
}
如果需要的话还有我的typdefs和标题;
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define TYPED_ALLOC(type) (type *)malloc(sizeof (type))
typedef struct tree_element_s {
char name[10];
char sName[10];
int seatClass;
}tree_element_t;
typedef struct tree_node_s {
tree_element_t element;
struct tree_node_s *leftp, *rightp;
}tree_node_t;
我的问题是它没有创建二叉搜索树的根。当我尝试向堆添加新元素时,它似乎创建了一个新节点。当我跟踪我的代码时,似乎这个函数的每个实例都返回 NULL。我想说的是,每次调用 tree_insert 时,它都会先执行 if 语句(认为 root 为 NULL)... 对不起,我的英语不好。而且我在谈论编码术语时可能会犯一些错误(可能是因为,我在离开一年后又从那本书中重新学习了C。所以我可能会混合它们) 提前致谢。
最佳答案
在add_to_t中,您更新了oldTreep,但由于它是一个局部变量,因此一旦您离开该函数,新值就会丢失。
例如,您可以将 oldTreep 的新值返回给调用者,调用者用返回值更新他的 oldTreep
tree_node_t
add_to_t(tree_node_t *oldTreep, // input/output - binary search tree
tree_element_t ele) // input - element to add
{
return tree_insert(oldTreep, ele);
}
...
myRootOfTheTree = add_to_t (myRootOfTheTree, element);
另一种解决方案是在树中始终有一个虚拟元素。
关于c - 二叉搜索树插入不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12127335/