द्विआधारी खोज पेड़ हटाने की (Inorder Pred विधि) सी ++

वोट
1

ठीक है तो मैंने सोचा कि यह तय किया गया था, लेकिन मैं पूरी तरह से असंगत परिणाम हो रही है। मैं इसे खरोंच से एक तरह से दुबारा लिखा ताजा शुरू करने के लिए और यहाँ मेरी परिणाम हैं। मैं कोई त्रुटि, कोई क्रैश होने मिलता है, यह सिर्फ उन्हें हटाया नहीं जाता। यह बस पूरी तरह से पेड़ को खराब करता है और मुझे एक टन अधिक पत्तों देता है, और सब कुछ मिक्स। सुनिश्चित नहीं हैं कि कहाँ जाना

template <class T>
void BST<T>::remove(struct Node<T>*& root, const T& x)
{
   Node<T>* ptr = root;
   bool found = false;
   Node<T>* parent;


   while (ptr != NULL && !found)
   {
       if (x < ptr->data)
       {
           parent = ptr;
           ptr = ptr->left;
       }
       else if (x > ptr->data)
       {
           parent = ptr;
           ptr = ptr->right;
       }
       else
           found = true;
   }

   if (found == false)
       return;
   else
   {
       if(ptr->left != NULL && ptr->right != NULL)
       {
           Node<T>* inOrderPtr = ptr->left;
           parent = ptr;
           while (inOrderPtr->right != NULL)
           {
               parent = inOrderPtr;
               inOrderPtr = inOrderPtr->right;
           }

           ptr->data = inOrderPtr->data;
           ptr = inOrderPtr;
       }
    Node<T>* subPtr = ptr->left;
    if (subPtr == NULL)
        subPtr = ptr->right;

    else if (parent->left == ptr)
        parent->left = subPtr;

    else
        parent->right = subPtr;

    delete ptr;
    }
29/10/2008 को 05:56
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
0

आपके पास कॉल नहीं किया जाना चाहिए remove()तीसरे मामले में रिकर्सिवली (जहां अपने "यकीन नहीं है कि अगर यह सही है" टिप्पणी है)। इस मामले में जहां दूर करने के लिए नोड दो बच्चे हैं, क्या आप क्या करना चाहते बाईं बच्चे की सही-अधिकांश बच्चे लगता है (जैसा कि आप कर रहे हैं, जिसके परिणामस्वरूप नोड में संग्रहीत किया जाता है parent)। इस नोड का कोई अधिकार नहीं बच्चा है - यह इतना है कि यह सही चाइल्ड नोड के दाईं बच्चे हटाया जाने वाला है। तो बस बदल rootचर अपनी बाईं बच्चे हो, कोई बदलने की जरूरत है dataकिसी भी नोड्स में किसी सदस्य या कॉल करने के लिए removeरिकर्सिवली।

तस्वीरों में:

पहले:
         आर <- जड़ अंक यहाँ
       / \
      / \
     अब
    / \ / \
   xcyy
      / \
     xd
        /
       एक्स

बाद:
      एक <- जड़ अंक यहाँ
     / \
    XC
       / \
      xd
         / \
        एक्सबी
           / \
          Y y
29/10/2008 को 06:22
का स्रोत उपयोगकर्ता

वोट
0

प्रत्येक टी पेड़ अद्वितीय में पाए जाते हैं? ऐसा लगता है कि वे अपने कोड से कर रहे हैं ...

ऐसा लगता है कि यह काम करना चाहिए:

किसी और मामले में रूट नोड को हटाने:

Node<T> *tmp_r = root->left;
Node<T> *parent = root;
while (tmp_r->right != NULL)
{
    parent = tmp_r;
    tmp_r = tmp_r->right;
}
Node<T> *tmp_l = tmp_r;
while (tmp_l->left != NULL)
    tmp_l = tmp_l->left;

tmp_l->left = root->left;
tmp_r->right = root->right;
parent->right = NULL;

parent = root;
root = tmp_r;
delete parent;
29/10/2008 को 06:57
का स्रोत उपयोगकर्ता

वोट
1

क्या वास्तव में हो रहा था कि हो सकता है खोजें इसलिए यह वास्तव में सिर्फ सही चलते रहो होगा उल्टे हो गए थे लेकिन डेटा वास्तव में सही ढंग से मिलान नहीं किया गया था और इसलिए यह एक दीवार ऐसा लगता है हिट होता है।

if (root->data < x)
        remove(root->left, x);
    else 
        remove(root->right, x);

होना चाहिये था

if(x < root->data)
remove(root->left, x);
else
remove(root->right, x);
29/10/2008 को 08:09
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more