Raw BinaryTree を作成しました。このツリーでは、挿入は BSTとは異なり、次のようになります::
- ツリーが空の場合は、値を追加してルートにします。(仮に30人)
- ツリーが空でない場合は、親の値 (30) を入力し、左側のサブツリーに新しい値 (20) を追加します。
- 左のサブツリーが空でない場合は、値 (20) を右のサブツリーに挿入します。
- 次の挿入では、親の値を再度取得して、値を追加する場所を決定します。& すぐ..
2 つの子を持つノードを削除しようとする場合を除いて、正常に動作します。削除に使用するメソッドはdeleteWithCopyです。
私のインストラクターが言ったように、deletewithcopy は次のとおりです。 1. 削除するノード (temp) の親を見つけます。2. temp (削除するノード) が「父」の右の子である場合、一時の直下の後継者を見つけます 3. 一時 (削除するノード) が「父」の左の子である場合、一時の直系の先行を見つけます 4. 値を交換しますtemp とその前身/後継者 5. temp を削除します (現在はツリーの葉です)。
NOW 後継者と先行者を見つける方法。
サクセサ = ノードの論理的サクセサは、左サブツリーの右端の子です
Predecessor = ノードの論理的な先行は、右側のサブツリーの一番左の子です。
アルゴリズムに従って関数を作成しましたが、削除した後、ツリーをトラバース (または印刷) すると、実行時エラー、binarytree.exe の 0x008B5853 で未処理の例外が表示されます: これは、「0xFEEEFEEE は、Visual C++ で解放されたメモリをマークするために使用されます」のエラーです。
私はこのことを何度も何度もドライランしました。私がアクセスしようとしている範囲外のものはメモリにありません。すべてのルーズエンドを修正しましたが、それでも:(
関数は次のとおりです。
void BinaryTree<mytype>::deletewithTwoChild(BTNode<mytype> *temp)
{
BTNode<mytype> *father = findfather(temp, root); //found address of father of temp node & stored it in pointer
BTNode<mytype> *leaf = temp; //created a copy of temp node
/////CASE 1 (for predecessor)
if(temp==root || father->left==temp) //if temp is left child of its father then
{
leaf = leaf->left; //move leaf 1 time left
while(leaf->right!=0 ) //until leaf reaches the right most node of left subtree
{
leaf = leaf->right; //move leaf 1 time to right
}
//swapping values
mytype var = leaf->key_value; //created a template variable to store leaf's key
leaf->key_value = temp->key_value; //assigning temp's key to leaf
temp->key_value = var; //assigning leaf's key to temp
if(leaf->right!=0) //if leaf has right child then call deletewithOneChild function
{
deletewithOneChild(leaf); //call to respective function
}
else if(leaf->left==0 && leaf->right==0) //if leaf has no children then
{
deleteWithNoChild(leaf); //call to respective function
}
}
/////CASE 2 (for successor)
else if(father->right==temp) //if temp is right child of its father, then
{
leaf = leaf->right; //move leaf 1 time right
while(leaf->left!=0) //until leaf reaches the last node of tree which has no child
{
leaf = leaf->left; //move leaf 1 time to left
}
//swapping values
mytype var = leaf->key_value; //created a template variable to store leaf's key
leaf->key_value = temp->key_value; //assigning temp's key to leaf
temp->key_value = var; //assigning leaf's key to temp
if(leaf->right!=0) //if leaf has right child then call deletewithOneChild function
{
deletewithOneChild(leaf); //call to respective function
}
else if(leaf->left==0 && leaf->right==0) //if leaf has no children then
{
deleteWithNoChild(leaf); //call to respective function
}
}
}
私が使用しているデータセット:
30
/ \
20 80
/ / \
10 40 120
\ / \
60 100 140
/ \ / \
50 70 130 150
実行時エラーが表示されたときに、ノード 80、60、120、140 を削除しようとしています。Plz help :(( また、30 が削除された場合にツリーを処理する方法についてもガイドが必要です。