Продолжение статьи про бинарные деревья...Уже третья часть...
На повестке дня - 2 вида поиска в бинарном дереве. Точнее, вид один, но видов возращаемых значений 2 - это true/false и pointer, то есть указатель на элемент в дереве.
Использовать будем конечно шаблоны и рекурсию. Ниже листинги этих четырёх (2 основных и две, которые вызываются рекурсивно) функций.
На повестке дня - 2 вида поиска в бинарном дереве. Точнее, вид один, но видов возращаемых значений 2 - это true/false и pointer, то есть указатель на элемент в дереве.
Использовать будем конечно шаблоны и рекурсию. Ниже листинги этих четырёх (2 основных и две, которые вызываются рекурсивно) функций.
Возращает  булевское значение :
bool FindReturnBool(const TypeOfTree& dataToInsert);
//Вспомагательная функция для поиска елемента(true/false)
bool _FindReturnBool(BinaryTree<TypeOfTree>* element,const TypeOfTree& dataToInsert);
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) ;
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);
             }
}
 
Комментариев нет:
Отправить комментарий