C++ Сравнить два N-арных дерева

137
11 января 2020, 08:10

У меня есть 2 дерева представленные такой структурой подскажите идею как их можно сравнить между собой,(данные хранятся только в листах)

struct mnozhestvo
{
 string value;
 mnozhestvo *parent;// родитель для братьев один 
 mnozhestvo *child;
 mnozhestvo *brothers;
};

вообще мне предложили реализовать деревья представленным ниже образом, может при таком подходе их будет проще сравнить друг с другом? У кого какие предложения будут

struct mnozhestvo
{
  string data;
  vector <mnozhestvo>  branch;
};
Answer 1

Вообще-то во втором варианте все получается куда проще. В первом вам нужно рекурсивно идти по двум деревьям и сравнивать все содержащиеся в них данные "почленно". И это в случае, если порядок "братьев" играет роль. Если не играет - все становится сложнее, так как нужно искать, где какой брат, а еще может быть так, что два брата с одинаковыми данными имеют разных потомков...

Так что давайте ограничимся структурой, в которой потомки упорядочены.

Тогда во втором случае достаточно написать оператор сравнения типа

struct mnozhestvo
{
  string data;
  vector <mnozhestvo>  branch;
};
bool operator == (const mnozhestvo& a, const mnozhestvo& b)
{
    return (a.data == b.data) && (a.branch == b.branch);
}

и все. Сравнение векторов само применит к их элементам операцию сравнения.

А дальше - сравнивать два дерева простым оператором ==.

Answer 2

вот функция сравнения двух деревьев

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;
}
}
READ ALSO
Проблема с методами доступа к private полям;

Проблема с методами доступа к private полям;

В классе ,в private полях есть объект другого классаУ этого объекта есть закрытые поля

113
Как регистрировать С++ классы для QML? module &ldquo;&rdquo; version 0.1 is not installed

Как регистрировать С++ классы для QML? module “” version 0.1 is not installed

Я делаю по урокуНо у меня ошибка :qrc:/Samples/Analysis/ViewshedGeoElement/ViewshedGeoElement

146
С++ заполнение поля класса в компил-тайме

С++ заполнение поля класса в компил-тайме

Хотелось бы получить возможность заполнять байтовое поле в классе гарантировано в компил-тайме используя человекочитаемые enum'ы и структурыНапример:

133
Не могу подключить libpng к проекту в VS Community 2017

Не могу подключить libpng к проекту в VS Community 2017

Никак не могу найти, как правильно установить libpng для VS community 2017Не смог установить при помощи видео с установкой для VS 2015, так как не совпадают...

94