2015-07-30 3 views
0

Это место, где я пытаюсь решить эту конкретную проблему: http://mycodeschool.com/work-outs/binary-search-trees/7C++ Удаление узла из бинарного дерева поиска

В случае узел будет удален имеет как дети, стратегия принять, чтобы заменить, что узел с максимальным значением в левом поддереве (позволяет называть его MAX_LEFT). Затем вы можете просто удалить узел MAX_LEFT. Эта стратегия также обсуждается в нашем видео для этой проблемы.

Я пытаюсь решить эту проблему, используя код ниже. Но есть некоторые проблемы, и я не получаю ожидаемого результата.

struct Node 
    { 
    int data; 
    struct Node* left; 
    struct Node* right; 
    } 

Node* FindMax(Node* root) 
{ 
    if(root==NULL) 
    return NULL; 

    while(root->right != NULL) 
    { 
     root = root->right; 
    } 
    return root; 
} 
Node* DeleteNodeInBST(Node* root,int data) 
{ 
    if(root==NULL) return root; 
    else if(data<=root->data) 
     root->left = DeleteNodeInBST(root->left, data); 
    else if (data> root->data) 
     root->right = DeleteNodeInBST(root->right, data); 
    else 
    { 
     //No child 
     if(root->right == NULL && root->left == NULL) 
     { 
      delete root; 
      root = NULL; 
     } 
     //One child 
     else if(root->right == NULL) 
     { 
      Node* temp = root; 
      root= root->left; 
      delete temp; 
     } 
     else if(root->left == NULL) 
     { 
      Node* temp = root; 
      root= root->right; 
      delete temp; 
     } 
     //two child 
     else 
     { 
      Node* temp = FindMax(root->left); 
      root->data = temp->data; 
      root->left = DeleteNodeInBST(root->left, temp->data); 
     } 
    } 
    return root; 
} 
+4

Попробуйте запустить в отладчике и выполните код за строкой. Кроме того, если у вас возникла проблема с неожиданным выходом, то, пожалуйста, покажите как фактический, так и ожидаемый результат. Было бы также очень полезно видеть, как вы используете эти функции (т. Е. Пытаетесь создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve)). –

+4

вместо того, чтобы писать «Но есть некоторые проблемы», описывают, что вы ввели, что вы ожидаете и что получаете. –

+0

Это место, где я пытаюсь решить эту проблему: http://mycodeschool.com/work-outs/binary-search-trees/7 – ABCD

ответ

2

Эта часть

if(data<=root->data) 
    root->left = DeleteNodeInBST(root->left, data); 
else 
    ... 

будет уходить влево поддереве также, когда data - равен текущему узлу root. В результате вы будете никогда добраться до третьего else. Попробуйте заменить <= на <.

1

В сегменте кода ниже, после 2 еще если заявление, окончательное еще утверждение никогда не выполняется, потому что нет никакой другой возможности:

else if(data<=root->data) 
     root->left = DeleteNodeInBST(root->left, data); 
else if (data> root->data) 
     root->right = DeleteNodeInBST(root->right, data); 
else 
     .... 
0

Got it. Я должен удалить «=» в «else if (data < = root-> data)», а затем он работает.

Смежные вопросы