簡體   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