C语言中的二叉树

C语言中的二叉树,c,binary-tree,C,Binary Tree,我有以下代码: 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-&

我有以下代码:

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;
}
struct树节点;
类型定义结构树节点*树节点;
树状结构{
作废*数据;
树节点左,右;
};
TreeNode新绿节点(void*数据){
TreeNode节点=(TreeNode)malloc(sizeof(struct TreeNode));
节点->数据=数据;
节点->左=空;
节点->右=空;
返回节点;
}
布尔插入(树节点树,树节点,int(*comp)(void*,void*)){
if(tree==NULL){
树=节点;
返回true;
}
如果(组件(节点->数据,树->数据)==0){
返回false;
}
else if(comp(节点->数据,树->数据)<0){
插入((树->左),节点,组件);
}
否则{
插入((树->右),节点,组件);
}
返回false;
}
整数比较(void*i,void*j){
如果(*(int*)i<*(int*)j)
返回-1;
else如果(*(int*)i==*(int*)j)
返回0;
其他的
返回1;
}
它适用于3个节点,但当我尝试插入更多节点时,它不会超过树的第一行(根之后的那行),因为它似乎没有更新根节点。我认为这与我的insert方法中的指针有关,但我已经尝试了我能想到的一切,但仍然一事无成


非常感谢您的帮助。

您只需修改树的本地副本。尝试:


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(*comp)(void*,void*){
如果(*tree==NULL){
*树=节点;
返回true;
} 
如果(comp(node->data,(*tree)->data)==0{
返回false;
} 
如果(comp(node->data,(*tree)->data)<0{
插入(&((*树)->左),节点,组件;
} 
否则{
插入(&((*树)->右),节点,组件;
} 
返回false;
}
问题(或者至少是一个问题)就在这里:您将
作为指向树节点的指针传入,然后将
节点
分配给该指针——但您只分配给指针的本地副本,这不会影响该函数外部的指针。要完成某项任务,您需要以下内容:

bool insert(TreeNode *tree, TreeNode node, int (*comp)(void *, void *)) { 
    if (*tree == NULL) {
        *tree = node;
        return true;
    }
// ....
这样,您就可以更改其地址被传递到函数中的指针


另一方面,您可能会考虑在创建时总是将单个节点放入树中,因此您只与根节点的子节点一起工作,并且永远不会遇到插入根节点本身的(有点特殊的情况)。

< p>您需要一个指向树型节点的指针来修改它。否则,您只能修改副本


布尔插入(树节点*树,树节点,int(comp)(无效,无效*)

在显示的代码中,从未调用newTreeNode。
bool insert(TreeNode *tree, TreeNode node, int (*comp)(void *, void *)) { 
    if (*tree == NULL) {
        *tree = node;
        return true;
    }
// ....

bool insert(TreeNode* tree, TreeNode node, int (comp)(void, void*)