2013-11-09 5 views
0

У меня возникла огромная проблема с моей рекурсивной функцией в моем двоичном дереве поиска. Мой проект должен состояться через несколько часов, и я не могу на всю жизнь ухаживать за инструктором.Оператор присваивания двоичного поиска

Моя функция, кажется, касается только левой ветви моего дерева.

Оператор присваивания:

template<typename Type> 
BST<Type>& BST<Type>::operator=(const BST& that) 
{ 
    if(this != &that) 
    { 
     this->clear(); 
     Node *c = that.root; 
     preORet(c); 
    } 
    return *this; 
} 

Рекурсивный Function Вызывается:

template<typename Type> 
void BST<Type>::preORet(Node *c) 
{ 
    this->insert(c->data); 

    if(c->left != nullptr) 
     preORet(c->left); 
    else if(c->right != nullptr) 
     preORet(c->right); 
} 

Как и в сторону, я понимаю, что многое из этого может выглядеть серьезно извращается код, но это, как мой инструктор ожидает это посмотреть.

Заранее спасибо.

ответ

3

Ваша проблема здесь:

if(c->left != nullptr) 
    preORet(c->left); 
else if(c->right != nullptr) 
    preORet(c->right); 

Вы не хотите else if. Вы хотите пересечь правое поддерево, независимо от того, было ли левое поддерево nullptr.

0

Избавиться от этого else.

Как ваша конструкция выглядит, на первый взгляд, чтобы быть легко move или swap состояния, я хотел бы использовать идиому swap копирования, чтобы генерировать достаточно эффективно, легко писать operator=.

Но это только я.

1

В дополнение к выходу else в вашу preORet() функцию, как указали другие, также стоит отметить, что вы получите ошибку сегментации (код ошибки 11), если вы пройдете нулевой указатель через ваш параметр Node *c.

Вот решение:

template<typename Type> 
void BST<Type>::preORet(Node *c) 
{ 
    if (c != nullptr) 
    { 
     this->insert(c->data); 
     preORet(c->left); 
     preORet(c->right); 
    } 
} 

Таким образом, каждый указатель прибудете к зарегистрированному, чтобы увидеть, если она равна нулю, прежде чем использовать, в том числе левого и правого указателей. Если он равен нулю, он просто провалится, выходит за рамки.

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