C中的二叉树

时间:2010-03-10 15:20:59

标签: 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->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个节点,但是当我尝试插入更多时,它不会越过树的第一行(根之后的行),因为它似乎没有更新根节点。我认为这与我的插入方法中的指针有关,但我已经尝试了我能想到的一切,但我仍然无处可去。

非常感谢任何帮助。

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*)