[英]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
功能中建議的操作。 如果root
為NULL
,則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.