2013-02-26 2 views
0
#include <iostream> 
#include <string> 
#include <fstream> 
using namespace std; 
template <class T> 
struct TreeNode{ 
    string value; 
    T key; 
    TreeNode<T> *Parent; 
    TreeNode<T> *LeftChild; 
    TreeNode<T> *RightChild; 
    TreeNode (T k,string Val) 
    { 
    this->value=Val; 
    this->key=k; 
    this->Parent=NULL; 
    this->LeftChild=NULL; 
    this->RightChild=NULL; 
    } 
}; 

template <class T> 
class BinaryTree{ 
    private: 
    TreeNode<T> *Root; 
    public: 
     BinaryTree(); 
     void LoadTree(const char file[]); 
     ~BinaryTree(); 
     void insertNode(T Key,string Val); 
     void deleteNode(T Key); 
     string searchNode(T Key); 
     void UpdateKey(T newkey,T oldkey); 
     int Height(TreeNode<T> *node); 
     int height(); 
}; 

template <class T> 
BinaryTree<T>::BinaryTree() 
{ 
    Root=NULL;      
} 

template <class T> 
void BinaryTree<T>::insertNode(T Key,string Val) 
{ 
    TreeNode<T> **temp=&Root; 
    TreeNode<T> *temp1=NULL; 
    if (*temp==NULL) 
    { 
    Root=new TreeNode<T>(Key,Val); 
    return; 
    } 
    else 
    {    
    while (*temp!=NULL) 
    { 
     temp1=*temp; 
     if (temp1->key>Key) 
     { 
      temp=&(*temp)->LeftChild; 
     } 
     else if (temp1->key<Key) 
     { 
      temp=&(*temp)->RightChild; 
     } 
    } 
    } 
    *temp=new TreeNode<T>(Key,Val);    
    (*temp)->Parent=temp1; 
} 

template <class T> 
void BinaryTree<T>::LoadTree(const char *file) 
{ 
    ifstream fin; 
    fin.open(file); 
    string buffer; 
    T buff; 
    while (!fin.eof()) 
    { 
     getline(fin,buffer,'~'); 
     fin>>buff; 
     if (!buff) 
     continue; 
     insertNode(buff,buffer); 
    }   
    fin.close(); 
} 

void BinaryTree<T>::deleteNode(T Key) 
{ 
    TreeNode<T> *temp=Root; 
    TreeNode<T> *temp1=temp; 
    while (temp!=NULL) 
    { 
     if (temp->key==Key) 
     { 
      temp1=temp;    
      if (temp==Root) 
      { 
       TreeNode<T> *temp2=Root; 
       temp2=temp2->RightChild; 
       while (temp2->LeftChild!=NULL) 
       { 
        temp2=temp2->LeftChild; 
       } 
       temp->key=temp2->key; 
       temp->value=temp2->value; 
       delete temp2;    
      } 
      else if (temp->RightChild==NULL) 
      { 
       TreeNode<T> *temp2=temp; 
       temp2=temp->Parent; 
       if (temp2->RightChild==temp) 
       { 
        temp2->RightChild=temp->LeftChild; 
        (temp->LeftChild)->Parent=temp2; 
       } 
       else if (temp2->LeftChild==temp) 
       { 
        temp2->LeftChild=temp->LeftChild; 
        (temp->LeftChild)->Parent=temp2; 
       } 

       delete temp1; 
       delete temp; 
       return; 
      } 
      else if (temp->LeftChild==NULL) 
      { 
       TreeNode<T> *temp2=temp; 
       temp2=temp->Parent; 
       if (temp2->RightChild==temp) 
       { 
        temp2->RightChild=temp->RightChild; 
        (temp->RightChild)->Parent=temp2; 
       } 
       else if (temp2->LeftChild==temp) 
       { 
        temp2->LeftChild=temp->RightChild; 
        (temp->RightChild)->Parent=temp2; 
       } 
       delete temp1; 
       delete temp; 
       return; 
      } 
      else if (temp->RightChild!=NULL) 
      { 
       TreeNode<T> *tmp=temp; 
       temp=temp->RightChild; 
       if (temp->LeftChild!=NULL) 
       { 
        while (temp->LeftChild!=NULL) 
        { 
         tmp=temp; 
         temp=temp->LeftChild; 
        }  
       } 
       if (tmp!=temp1) 
       tmp->LeftChild==NULL; 
       else 
       temp1->RightChild==NULL; 

       temp1->key=temp->key; 
       temp1->value=temp->value; 
       delete temp; 
       return; 
      } 
     } 
     if (temp->key>Key) 
     { 
      temp=temp->LeftChild; 
     } 
     else if (temp->key<Key) 
     { 
      temp=temp->RightChild; 
     } 
}        
return; 
}   

Это часть кода для дерева двоичного поиска, которое я создаю. Я сталкиваюсь с проблемой при запуске функции удаления, то есть для некоторых узлов, я получаю ошибка «test.exe перестала работать» .testing - это имя моего основного файла. Я проверил снова и снова, но, похоже, я не нашел проблему. Кто-нибудь видит проблему? СпасибоДвоичное дерево поиска - функция удаления не работает

+0

Там не хватает Информация. Вы объявляете экземпляр BinaryTree, а затем заполняете его, а затем выполняете поиск? –

+2

Запустите программу в режиме отладки (F5 в Visual Studio), которая покажет вам линию, в которой он врезался. – Turch

+0

да, я отправлю код –

ответ

1

В обоих случаях где вы удаляете temp1 и temp, они оба указывают на тот же адрес.

+0

Большое спасибо за указание! Моя ошибка. Извините за все неприятности. –

+0

его работа сейчас !! :) –

2

Существует определенно более чем одна проблема с вашим кодом.

Предположим, ключ, который будет удален хранится в корневом каталоге:

if (temp->key==Key) 
{ 
    temp1=temp;    
    if (temp->RightChild==NULL) 
    { 
    TreeNode<T> *temp2=temp; 
    temp2=temp->Parent;   // temp2 will be NULL here 
    if (temp2->RightChild==temp) 
    { 
     temp2->RightChild=temp->LeftChild; // thus dereferencing NULL either here 
     (temp->LeftChild)->Parent=temp2; 
    } 
    else if (temp2->LeftChild==temp) 
    { 
     temp2->LeftChild=temp->LeftChild; // ... or here 
     (temp->LeftChild)->Parent=temp2; 
    } 

    delete temp1; 
    delete temp; 
    return; 
    } 

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

if (temp->key==Key) 
{ 
    temp1=temp;    
    if (temp->RightChild==NULL) 
    { 
    // do something 
    } 
    else if (temp->LeftChild==NULL) 
    { 
    // do something 
    } 
    else if (temp->RightChild!=NULL) 
    { 
    // do something 
    } 
    else if (temp->LeftChild!=NULL && temp->RightChild==NULL) 
    { 
    // code never reached 
    } 
} 
+0

Я думал об удалении последнего, если бы я didn't. не знаю, почему. удалит его тогда –

+0

, и я добавил отдельное условие, если temp == Root. –

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