繁体   English   中英

C-空的二进制搜索树,然后插入

[英]C - empty binary search tree then insert after that

没有正确清除二进制树并产生地址,并且根目录所在的位置为null。 当它插入所有内容时,它确实会插入它和其余的空指针(未清除的节点)。

如何正确清除二叉树?

代码如下。

void empty(Node * node) {
    Node * left = node->left;
    Node * right = node->right;
    free(node);
    if (left)
        empty(left);
    if (right)
        empty(right);
}

Node * insert(Node * node, int value){
    if(node == NULL){
        node = (Node *)malloc(sizeof(Node));
        node->value = value;
        node->left = NULL;
        node->right = NULL;
        return node;
    }
    if(value > node->value){
        node->right = insert(node->right,value);
    }
    else if(value < node->value){
        node->left = insert(node->left,value);
    }
    else {
      return;
    }
  return node;
}

void inorder(Node * node){
    if(node == NULL) {
        return;
    }
    inorder(node->left); 
    printf("%.1f ", (float) node->value);
    inorder(node->right); 
}

int main() {
Node * root = NULL;

root = insert(root, 5);
root = insert(root, -1);
root = insert(root, 3);
root = insert(root, -14);
root = insert(root, 8);
root = insert(root, 10);

empty(root);
insert(root, 6);
inorder(root);
}
}

一切看起来不错,除了

 empty(root);
 insert(root, 6);

empty(root); root不是NULL ,只是一些垃圾,因此您需要在调用insert函数之前重新分配它( root = NULL; )。 调用insert也是有问题的,以与root = insert (root, 6);之前相同的方式进行root = insert (root, 6);

还可以执行Deduplicator在empty功能中建议的操作。 如果rootNULL ,则empty将崩溃,因此在使用左右指针之前,请检查节点是否为NULL。

修复为空:

Node* empty(Node * node) {
    if(node) {
        empty(node->left);
        empty(node->right);
        free(node);
    }
    return 0;
}

另外,main中的顺序不正确(可能是因为您在错误之后停止了...):

empty(root);
insert(root, 6);
inorder(root);

用。。。来代替:

root = empty(root);
root = insert(root, 6);
inorder(root);
/*free(root);*/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM