द्विआधारी खोज वृक्ष में विलोपन

वोट
0

तो जब मैं द्विआधारी खोज वृक्ष में हटाने के लिए, मैं 7 की तरह अलग अलग मामलों यानी राशि की आवश्यकता क्यों है

  1. वाम पत्ता;
  2. राइट पत्ता;
  3. केवल छोड़ दिया बच्चे के साथ वाम बच्चे। // यानी नोड हटाए जाने के लिए यह के बाईं बच्चा है माता पिता है और यह केवल बच्चे छोड़ दिया है।
  4. केवल सही बच्चे के साथ वाम बाल।
  5. केवल छोड़ दिया बच्चे के साथ सही बच्चे।
  6. केवल सही बच्चे के साथ सही बच्चे।
  7. नोड हटाए जाने के लिए दोनों बच्चों दाएं और बाएं अर्थात।

अब जब इस कोड का उपयोग कर रहा है if-elseयह बहुत बुरा हो जाता है .. वहाँ ऐसा करने का कोई अन्य तरीका है।

यहाँ मेरी कोड स्निपेट है

if(current->left==NULL && current->right==NULL && current->key<prev->key)   //left leaf
prev->left=NULL;
else if(current->left==NULL && current->right==NULL && current->key>prev->key) // right     leaf
prev->right=NULL;
else if(current->left!=NULL && current->right==NULL && current->key<prev->key) // left     child with one child
prev->left=current->left;
else if(current->left==NULL && current->right!=NULL && current->key<prev->key)
prev->left=current->right;
else if(current->left!=NULL && current->right==NULL && current->key>prev->key)
prev->right=current->left;
else if(current->left==NULL && current->right!=NULL && current->key>prev->key)
prev->right=current->left;
else if(current->left!=NULL && current->right!=NULL)
{
    check=current->right;
    check1=check;
    while(check->left!=NULL)
    {
    check1=check;
    check=check->left;
    }
    *current=*check;
    check1->left=NULL;
}
30/09/2011 को 06:10
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
1

एक शून्य सूचक हटाया जा रहा है कोई बीमार प्रभाव पड़ता है। इसलिए, जब आप कोई विशेष मामलों के साथ ऐसा करने में सक्षम होना चाहिए। बुनियादी हिस्सा सिर्फ है:

delete current->left;
delete current->right;
30/09/2011 को 06:14
का स्रोत उपयोगकर्ता

वोट
3

आप यह है कि तुलना में बहुत सरल रख सकते हैं, और जब एक BST (बाइनरी खोज पेड़) से एक नोड हटाने का तीन मामलों को खुद को सीमित:

  1. बच्चों के बिना एक नोड (एक पत्ता): - विशेष जरूरतों कुछ नहीं किया जा करने के लिए बस इसे हटा
  2. एक बच्चे के साथ एक नोड: इसे हटाने, और उसके स्थान पर बच्चे को ले जाने के
  3. दो बच्चों के साथ एक नोड: या तो अपने इन-आदेश पूर्ववर्ती या उत्तराधिकारी के साथ यह स्वैप, और फिर इसे हटाने

विकि पृष्ठ इस कोड में कैसा नज़र आ सकता है एक उदाहरण में शामिल है।

या सी में एक बहुत ही बुनियादी उदाहरण के रूप में:

if (current->left==NULL && current->right==NULL) {
    /* leaf node */
    bst_replace(current, NULL);
}
else if (current->left==NULL || current->right==NULL) {
    /* node with one child */
    bst_replace(current, ((current->left) ? current->left : current->right));
}
else {
    /* node with two children */
    Node* successor = bst_next(current);
    current->data = successor->data;
    bst_replace(successor, successor->right);
}
30/09/2011 को 06:18
का स्रोत उपयोगकर्ता

वोट
2

मैं वास्तव में यहाँ हटाने के लिए इस्तेमाल किया प्रोटोकॉल समझ में नहीं आता। आप एक बाइनरी 'खोज' पेड़ (वृक्ष में कोई आदेश) नहीं लग रहे हैं।

लेकिन अभी कोड सरल बनाने के लिए। आप कुछ इस तरह कर सकता है:

bool b1 = (current->left == NULL);
bool b2 = (current->right == NULL);
bool b3 = (current->key > prev->key);

int decision_case = b1 * 4 + b2 * 2 + b3;

switch(decision_case) {
  case 0: // fill in code here
          break;
  ...
  ...
  case 7: // fill in code here
          break;
}

इसके अलावा, आप का उपयोग करना चाहिए हटाना यहाँ मेमोरी लीक से बचने के लिए। उम्मीद है की वो मदद करदे।

30/09/2011 को 06:33
का स्रोत उपयोगकर्ता

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