Как добавить одиннаковые элементы в Авл-дерево, чтобы они хранились в одной вершине?
В Авл дерево добавляются элементы из массива структур. Добавление идёт только по 1 характеристике структуры. Нужно сделать так, чтобы одиннаковые элементы хранились в одной вершине ,и поворот выполнялся корректно.
bool rise;
struct vertex {
int i;
record data;
int balance;
vertex *left;
vertex *right;
};
void LL1(vertex *(&p)) {
vertex *q;
q = p->left;
if (q->balance == 0) {
q->balance = 1;
p->balance = -1;
}
else {
q->balance = 0;
p->balance = 0;
}
p->left = q->right;
q->right = p;
p = q;
}
void RR1(vertex *(&p)) {
vertex *q;
q = p->right;
if (q->balance == 0) {
q->balance = 1;
p->balance = -1;
}
else {
q->balance = 0;
p->balance = 0;
}
p->right = q->left;
q->left = p;
p = q;
}
void LR(vertex *(&p)) {
vertex *q = new vertex;
vertex *r = new vertex;
q = p->left;
r = q->right;
if (r == NULL) return;
if (r->balance < 0)p->balance = 1;
else p->balance = 0;
if (r->balance > 0)q->balance = -1;
else q->balance = 0;
r->balance = 0;
p->left = r->right;
q->right = r->left;
r->left = q;
r->right = p;
p = r;
}
void RL(vertex *(&p)) {
vertex *q = new vertex;
vertex *r = new vertex;
q = p->right;
r = q->left;
if (r == NULL)return;
if (r->balance > 0)p->balance = -1;
else p->balance = 0;
if (r->balance < 0)q->balance = 1;
else q->balance = 0;
r->balance = 0;
p->right = r->left;
q->left = r->right;
r->left = p;
r->right = q;
p = r;
}
void add_AVL(vertex *(&p), record x,int index) {
if (p == NULL) {
p = new vertex;
p->data = x;
p->i = index;
p->left = NULL;
p->right = NULL;
p->balance = 0;
rise = true;
}else if (strcmp(p->data.keyTree().c_str(), x.keyTree().c_str()) < 0) {
add_AVL(p->left, x,index);
if (rise) {
if (p->balance > 0) {
p->balance = 0;
rise = false;
}
else if (p->balance == 0) {
p->balance = -1; rise = true;
}
else if (p->left->balance < 0) {
LL1(p);
rise = false;
}
else {
LR(p);
rise = false;
}
}
}else if (strcmp(p->data.keyTree().c_str(), x.keyTree().c_str()) >0){
add_AVL(p->right, x,index);
if (rise) {
if (p->balance < 0) { p->balance = 0; rise = false; }
else if (p->balance == 0) { p->balance = 1; rise = true; }
else if (p->right->balance > 0) {
RR1(p);
rise = 0;
}
else {
RL(p);
rise = false;
}
}
}
else if (strcmp(p->data.keyTree().c_str(), x.keyTree().c_str()) ==0){
//Не знаю как реализовать этот кусок
}
}