Поиск с барьером в двоичном дереве поиска

#include <iostream>

using namespace std;


struct Tree{
    int value;
    Tree* left;
    Tree* right;
};

Tree* Add(Tree*& a, int elem) {
        if (!a) {
            a = new Tree;
            a->value = elem;
            a->left = nullptr;
            a->right = nullptr;
            return 0;
        }
        else if (elem < a->value) {
            Add(a->left, elem);
        }
        else  {
            Add(a->right, elem);
        }
        return a;
}

Tree* FindParent(Tree*& start,int x, Tree* parent=nullptr) {
  
    if (start == nullptr)
        return NULL;
    if (start->value == x)
        return parent;
    else {
        if (x < start->value)  return FindParent(start->left, x, parent);
        else return FindParent(start->right, x, parent);
    }
}
void Del(int x,Tree*& a) {
    
    Tree* parent = nullptr;
    parent=FindParent(a, x, parent);
    if (!a) return;
    if (!a->left && !a->right) { 
        if (parent->left = a) parent->left = nullptr;
        else parent->right=nullptr;
        a->value = NULL; 
        delete a;
    }
    else if (a->left && !a->right) {//вместо a к parent цепляем левое поддерево
        if (parent && parent->left == a)
            parent->left = a->left;
        if (parent && parent->right == a)
            parent->right = a->left;
        delete a;
        return;
    }
    else if (!a->left && a->right) {     //вместо a к parent цепляем правое поддерево
        if (parent && parent->left == a)
            parent->left = a->right;
        if (parent && parent->right == a)
            parent->right = a->right;
        delete a;
        return;
    }
    else {
        Tree* min = a->left;//ищем наименьший элемент из левой ветки
        while (min->right) min = min->right;
        int min_value = min->value;
        Del(min_value,a);
        a->value = min_value;
    }
}
Tree*& Delete(Tree*& tree,int value) {
    if (tree == NULL)
        return tree;

    if (value == tree->value) {

        Tree* tmp;
        if (tree->right == NULL)
            tmp = tree->left;
        else {

            Tree* ptr = tree->right;
            if (ptr->left == NULL) {
                ptr->left = tree->left;
                tmp = ptr;
            }
            else {

                Tree* pmin = ptr->left;
                while (pmin->left != NULL) {
                    ptr = pmin;
                    pmin = ptr->left;
                }
                ptr->left = pmin->right;
                pmin->left = tree->left;
                pmin->right = tree->right;
                tmp = pmin;
            }
        }

        delete tree;
        return tmp;
    }
    else if (value < tree->value)
       tree->left = Delete(tree->left, value);
    else
        tree->right = Delete(tree->right, value);
    return tree;
}
void printTree(Tree*& a) {
    if (a) {
        cout << a->value<<" ";
        printTree(a->left);
        printTree(a->right);

    }
    else return;
}

bool findTree(Tree* a,int value) {
    int cmp = 0;
        while (a&& value !=a->value) {
                if (value < a->value) a=a->left;
                else a=a->right;  
                cmp++;
        }
        cout << "Количество сравнений: " << cmp << endl;
        return a!=NULL;
}
Tree*& addBarrier(Tree*& start,int stop) {
  
}
Tree*& findBTree(Tree*& start,int value,int stop) {
    int cmp=0;
    if (start->value == stop)
        return start;
    if (start->value == value)
        return start;
    else {
        if (value < start->value)
            start = findBTree(start->left, value, stop);
        else start = findBTree(start->right, value, stop);
    }
}

   
/* Tree* b=new Tree;
    b->value = x;
    int cmp = 0;
    Tree* parent = nullptr;
    Barrier(a,b);
    while (x != b->value) {
        if (x < a->value) a = a->left;
        else a = a->right;
        cmp++;
    }
    if (&a == &b) return false;
    cout << "Количество сравнений: " << cmp << endl;
    return a != NULL;*/
int main()
{
    setlocale(LC_ALL, "Russian");
    int x;
    int n;
    cout << "Введите количество элементов: " << endl;
    cin >> n;
    Tree* tree=NULL;
    cout << "Введите элементы дерева: "<<endl;
    for (int i = 0; i < n; i++) {
        cin >> x;
        Add(tree, x);
    }
    cout << "Элементы дерева: "<<endl;
    printTree(tree);
    cout << endl;
    cout << findTree(tree,5)<<endl<<endl;
    printTree(tree);
    cout << endl;
   // findBTree(tree,5,10);
   // printTree(tree);
    cout << endl;
    Delete(tree,3);
    printTree(tree);

}

Я почитал и, впринципе, понял,что такое поиск с барьером,но реализовать не могу. Не понимаю,как я должен всем нулевым веткам присвоить барьер. И это ведь должно происходить один раз. findBTree это функция при условии что есть уже барьер.А addBarrier функция,которую мне нужно написать. Вообще без понятия,как это сделать.


Ответы (0 шт):