Поиск с барьером в двоичном дереве поиска
#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 функция,которую мне нужно написать. Вообще без понятия,как это сделать.