2016-10-19 8 views
0

この機能に関する訂正をお願いします。問題は、ノードよりも多くのノードを削除することです。それは最初にすべての葉を削除していることを意味し、次にそれはちょうど作成された葉を削除しています。 訂正方法を教えてください。 リーフ=子ノードのないノード。バイナリ検索ツリーからすべてのリーフノードを削除する機能

typedef struct node { 
    int key; 
    node* left; 
    node* right; 
}node; 

void BST::DeleteLeafs() 
{ 
    if (root == nullptr) 
     throw InvalidOperationException(); 
    else 
     deleteLeavesHelper(nullptr, root); 
} 

void BST::deleteLeavesHelper(node* parent, node* n) 
{ 
    if (n == nullptr) 
     return; 
    else 
    { 
     if (n->left == nullptr && n->right == nullptr) 
     { 
      n = nullptr; 
      if (parent != nullptr) 
      { 
       parent->left = nullptr; 
       parent->right = nullptr; 
      } 
     } 
     else 
     { 
      deleteLeavesHelper(n, n->left); 
      deleteLeavesHelper(n, n->right); 
     } 
    } 
} 

答えて

0

あなたが書く:

if (n->left == nullptr && n->right == nullptr) 
    { 
     n = nullptr; 
     if (parent != nullptr) 
     { 
      parent->left = nullptr; 
      parent->right = nullptr; 
     } 
    } 

一つの問題は、あなたがnのためにメモリを解放する必要があり、そうしないと、メモリリークを持っています。 n=nullptr;は完全に役に立たない。

もう1つの問題は、両方の子へのポインターをparentにして無効にすることです。代わりに、正しい子へのポインタのみを無効にする必要があります。

if (n->left == nullptr && n->right == nullptr) { 
    if (parent != nullptr) { 
     if (parent->left == n) 
      parent->left = nullptr; 
     else if (parent->right == n) 
      arent->right = nullptr; 
     else 
      // raise some exception 
    } 
    // deallocate n 
} 
+0

ありがとうございました。私はそれを修正し、それは動作します。 –

+0

しかし別の問題があります。この関数はwhileループで(デストラクタ内で)呼び出されます。最後にルートを削除することになっています(ルートがリーフノードになるとき)が、ルートは削除されません。あなたはそれのためにいくつかの解決策を教えていただけますか? –

+0

それをデバッグして、ルートが削除されない理由を確認してください。 – user31264

関連する問題