У меня есть 2 дерева представленные такой структурой подскажите идею как их можно сравнить между собой,(данные хранятся только в листах)
struct mnozhestvo
{
string value;
mnozhestvo *parent;// родитель для братьев один
mnozhestvo *child;
mnozhestvo *brothers;
};
вообще мне предложили реализовать деревья представленным ниже образом, может при таком подходе их будет проще сравнить друг с другом? У кого какие предложения будут
struct mnozhestvo
{
string data;
vector <mnozhestvo> branch;
};
Вообще-то во втором варианте все получается куда проще. В первом вам нужно рекурсивно идти по двум деревьям и сравнивать все содержащиеся в них данные "почленно". И это в случае, если порядок "братьев" играет роль. Если не играет - все становится сложнее, так как нужно искать, где какой брат, а еще может быть так, что два брата с одинаковыми данными имеют разных потомков...
Так что давайте ограничимся структурой, в которой потомки упорядочены.
Тогда во втором случае достаточно написать оператор сравнения типа
struct mnozhestvo
{
string data;
vector <mnozhestvo> branch;
};
bool operator == (const mnozhestvo& a, const mnozhestvo& b)
{
return (a.data == b.data) && (a.branch == b.branch);
}
и все. Сравнение векторов само применит к их элементам операцию сравнения.
А дальше - сравнивать два дерева простым оператором ==
.
вот функция сравнения двух деревьев
struct element
{
string value; // либо элемент либо множество является элементом
struct mnozhestvo *elset;
};
struct mnozhestvo
{
element *el;
mnozhestvo *next;
};
bool sr_elmento(mnozhestvo **A, mnozhestvo **B)
{
mnozhestvo *a = *A;
mnozhestvo *b = *B;
int par_A = 0, kol_A = 0, par_B = 0, kol_B = 0;
while (a != NULL)
{
while (b != NULL)
{
if (a->el->elset != NULL && b->el->elset != NULL)
{
if (sr_elmento(&(a->el->elset), &(b->el->elset)) == true)
{
par_A++;
break;
}
}
if (a->el->value == b->el->value && (a->el->elset==NULL && b->el->elset==NULL))//сравниваем только значения и смотрим чтобы не было потомков
{
par_A++;
break;
}
b = b->next;
}
kol_A++;
b = *B; // возврат на пeрвый элемент
a = a->next;
}
bool flag_1 = false;
if (par_A == kol_A)
{
flag_1 = true;
}
a = *A; // возврат на пeрвый элемент
par_A = 0, kol_A = 0, par_B = 0, kol_B = 0;
while (b != NULL)
{
while (a != NULL)
{
if (a->el->elset != NULL && b->el->elset != NULL)
{
if (sr_elmento(&(a->el->elset), &(b->el->elset)) == true)
{
par_B++;
break;
}
}
if (a->el->value == b->el->value && (a->el->elset == NULL && b->el->elset == NULL))
{
par_B++;
break;
}
a = a->next;
}
kol_B++;
a = *A; // возврат на првый элемент
b = b->next;
}
bool flag_2 = false;
if (par_B == kol_B)
{
flag_2 = true;
}
if (flag_1 == true && flag_2 == true)
{
return true;
}
else
{
return false;
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
В классе ,в private полях есть объект другого классаУ этого объекта есть закрытые поля
Я делаю по урокуНо у меня ошибка :qrc:/Samples/Analysis/ViewshedGeoElement/ViewshedGeoElement
Хотелось бы получить возможность заполнять байтовое поле в классе гарантировано в компил-тайме используя человекочитаемые enum'ы и структурыНапример:
Никак не могу найти, как правильно установить libpng для VS community 2017Не смог установить при помощи видео с установкой для VS 2015, так как не совпадают...