2017-09-22 9 views
-4

私はBSTからリーフの削除機能を作成しました。 BSTが空の場合、BSTが空であることを通知します。そうでなければ、いくつかのケースがあります。それらの1つは、ノード(リーフ)に子がないことです。したがって、他のノードとのさらなるリンクは必要ありません。最初に、そのリーフを指しているポインタを削除し、nullを指し示すようにします。しかし、プログラムは残念なことにクラッシュしました。ここ は関数である。ここでバイナリ検索ツリーからリーフを削除する

void BinarySearchTree :: delete_node(float deleted_key) 
{ 
    Node* deleted_node_address=return_node_address(deleted_key); 

    if(root == NULL) cout<<"The tree is empty, No thing to delete\n"; 

    else if(deleted_node_address->left_ptr==NULL && deleted_node_address->right_ptr==NULL) 
    { 
     cout<<"The element has no children, No linking required\n"; 
     delete deleted_node_address; 
     deleted_node_address=NULL; 
    } 
} 

return_node_address機能です:

Node* BinarySearchTree ::return_node_address(float req_key,Node *traverse_ptr) 
{ 
    if(traverse_ptr==NULL) 
    { 
     cout<<"There is no data to return its addres"; 
     return 0; 
    } 
    else if(traverse_ptr->key == req_key) 
    { 
     return traverse_ptr; 
    } 
    else if(req_key < traverse_ptr->key && traverse_ptr->left_ptr != NULL) 
    { 
     return_node_address(req_key, traverse_ptr->left_ptr); 
    } 
    else if(req_key > traverse_ptr->key && traverse_ptr->right_ptr!= NULL) 
    { 
     return_node_address(req_key, traverse_ptr->right_ptr); 
    } 
    else 
    { 
     cout<<"The Key You Entred Is Not Found in The Tree"; 
     return 0; 
    } 

} 
+1

デバッガでプログラムを起動し、1行ずつステップ実行するまでの時間。 – user0042

+0

QTを使用しています。そのデバッガは動作しません!! – Ahmed

+2

それを稼働させてください。通常はそうです。 – user0042

答えて

1

割り当て

deleted_node_address=NULL; 

BinarySearchTree :: delete_node(float deleted_key)関数にローカルであるdeleted_node_address変数をクリアし、それではない削除されたノードへのポインタをクリアするeを親ノードから取得する。

結果として、ツリーは無効になりました。left_ptr、またはright_ptrの一部はNULLではなく、非オブジェクトを指していました。したがって、次に使用される未使用メモリにアクセスしようとするとクラッシュする可能性があります。

また、あなたがroot==NULLをテスト前を削除するノードを検索するreturn_node_address()関数を呼び出します。 return_node_addressメソッドがNULL-root-proof ...であると確信していますか?

+0

あなたは、削除されたノードを指しているポインタを、その親からnullを指すようにする必要がありますか?私は正しい? – Ahmed

+0

@Ahmedそうです。子ノードを削除すると、その親ノードはその子ノードを持たなくなります。 「左の子を持たない」または「右の子を持たない」は、正確にはそれぞれ「NULL」である「left_ptr」または「right_pttr」です。 – CiaPan

+0

@Ahmedおそらく、あなたは 'BSTからノードを削除'し、いくつかの実装例を調べるためにgoogleかもしれません。問題と可能な解決策に慣れたら、コードを再度参照して、欠落している部分を見つけてください。 – CiaPan

関連する問題