我有以下代码:
struct treenode;
typedef struct treenode* TreeNode;
struct treenode {
void* data;
TreeNode left, right;
};
TreeNode newTreeNode(void* data){
TreeNode node = (TreeNode) malloc(sizeof(struct treenode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
bool insert(TreeNode tree, TreeNode node, int (*comp)(void*, void*)){
if(tree == NULL){
tree = node;
return true;
}
if(comp(node->data, tree->data) == 0){
return false;
}
else if (comp(node->data, tree->data) < 0){
insert((tree->left), node, comp);
}
else {
insert((tree->right), node, comp);
}
return false;
}
int compare(void* i, void* j) {
if (*(int*)i < *(int*)j)
return -1;
else if (*(int*)i == *(int*)j)
return 0;
else
return 1;
}
它适用于3个节点,但是当我尝试插入更多时,它不会越过树的第一行(根之后的行),因为它似乎没有更新根节点。我认为这与我的插入方法中的指针有关,但我已经尝试了我能想到的一切,但我仍然无处可去。
非常感谢任何帮助。
答案 0 :(得分:1)
您只修改了树的本地副本。尝试:
bool insert(TreeNode* tree, TreeNode node, int (*comp)(void*, void*)){
if(*tree == NULL){
*tree = node;
return true;
}
if(comp(node->data, (*tree)->data) == 0){
return false;
}
else if (comp(node->data, (*tree)->data) < 0){
insert((&((*tree)->left)), node, comp);
}
else {
insert((&((*tree)->right)), node, comp);
}
return false;
}
答案 1 :(得分:1)
bool insert(TreeNode tree, TreeNode node, int (*comp)(void*, void*)){
if(tree == NULL){
tree = node;
return true;
}
问题(或至少 问题)就在这里:你传递tree
作为指向treenode的指针,然后你将node
分配给那个指针 - 但您只是指定指针的本地副本,这不会影响该函数之外的指针。要完成某些事情,你需要这样的东西:
bool insert(TreeNode *tree, TreeNode node, int (*comp)(void *, void *)) {
if (*tree == NULL) {
*tree = node;
return true;
}
// ....
这样,您正在更改其地址已传递到函数中的指针。
或者,您可能会考虑在创建时立即将单个节点放入树中,因此您只能使用根节点的子节点,并且您永远不会遇到插入根节点的(某种程度上)特殊情况本身。
答案 2 :(得分:1)
你需要一个指向你的Treenode的指针来修改它。否则你只是在修改副本。
bool insert(TreeNode* tree, TreeNode node, int (comp)(void, void*)