суббота, 31 марта 2012 г.

C++ : Алгоритмы - Бинарное дерево поиска. Часть III

Продолжение статьи про бинарные деревья...Уже третья часть...

На повестке дня - 2 вида поиска в бинарном дереве. Точнее, вид один, но видов возращаемых значений 2 - это true/false и pointer, то есть указатель на элемент в дереве.

Использовать будем конечно шаблоны и рекурсию. Ниже листинги этих четырёх (2 основных и две, которые вызываются рекурсивно) функций.

Возращает  булевское значение :
bool FindReturnBool(const TypeOfTree& dataToInsert);
//Вспомагательная функция для поиска елемента(true/false)
bool _FindReturnBool(BinaryTree<TypeOfTree>* element,const TypeOfTree& dataToInsert);     



//Листинг функции поиска элементов, которая возвращает true/false
template <typename TypeOfTree>
bool MainBinaryTree<TypeOfTree>::FindReturnBool(const TypeOfTree& dataToInsert)  {
       return _FindReturnBool(rootOfTree, dataToInsert);
}
template <typename TypeOfTree>
bool MainBinaryTree<TypeOfTree>::_FindReturnBool(BinaryTree<TypeOfTree>* element,const TypeOfTree& dataToInsert)  {
       if (!element)
             return false;
       else
             if (element->field == dataToInsert){
                    ++this->transitions;
                    return true;
             }
             else
                    if (dataToInsert < element->field){
                           ++this->transitions;
                           return _FindReturnBool(element->leftPointer, dataToInsert);
                    }
                    else{
                           ++this->transitions;
                           return _FindReturnBool(element->rightPointer, dataToInsert);
       }
}


Возращает  указатель :
BinaryTree<TypeOfTree>* FindReturnPointer(const TypeOfTree& dataToInsert); 
 //Вспомагательная функция для поиска елемента(pointer)
BinaryTree<TypeOfTree>* _FindReturnPointer(BinaryTree<TypeOfTree>* element, const TypeOfTree& dataToInsert) ;

//Листинг функции поиска элемента, который возвращает указатель на узел
template <typename TypeOfTree>
BinaryTree<TypeOfTree>* MainBinaryTree<TypeOfTree>::FindReturnPointer(const TypeOfTree& dataToInsert)  {
       return _FindReturnPointer(rootOfTree, dataToInsert);
}
template <typename TypeOfTree>
BinaryTree<TypeOfTree>* MainBinaryTree<TypeOfTree>::_FindReturnPointer(BinaryTree<TypeOfTree>* element, const TypeOfTree& dataToInsert)  {
       if (!element)
             return nullptr;
       else if (element->field == dataToInsert){
             ++this->transitions;
             return element;
       }
       else
             if (dataToInsert < element->field){
                    ++this->transitions;
                    return _FindReturnPointer(element->leftPointer, dataToInsert);
             }
             else{
                    ++this->transitions;
                    return _FindReturnPointer(element->rightPointer, dataToInsert);
             }
}



Комментариев нет:

Отправить комментарий