множество (объединение/пересечение)

58
09 декабря 2021, 21:30

Реализую отд множество с использованием бинарного дерева поиска. Столкнулась с такой проблемой: как реализовать в данном случае операции пересечение/ объединение / разницу? (Ниже пыталась сделать объединение, но что-то явно не то. Буду рада любой помощи!

#include <iostream>
#include <string>
#include <iostream>
#include <set>
using namespace std;
class Node               //наше дерево
{
public:
    Node* Left;
    Node* Right;
    int data;
    Node(int data = 0)
    {
        this->data = data;
        this->Left = nullptr;
        this->Right = nullptr;
    }
};
class Set //класс множество 
{
public:
    Set()
    {
        list = nullptr;
        list1 = nullptr;
    }
    ~Set()
    {}

    Node* getList()
    {
        return list;
    }
    Node* getList1()
    {
        return list1;
    }
    void left_to_right(Node * tree); //функция вывода
    bool ifNodeExists(Node* tree, int key); //проверка принадлежности элемента к множеству

Node * insert1(int x, Node* tree) //функция формирования /вставки
    {
        if (tree == NULL) { // Если дерева нет, то формируем корень
            tree =new Node; // память под узел
            tree->data = x;   // поле данных
            tree->Left =  NULL;
            tree->Right = NULL; // ветви инициализируем пустотой
        }else  if (x < tree->data)   // условие добавление левого потомка
            tree->Left = insert1(x, tree->Left);
        else if (x > tree->data)    // условие добавление правого потомка
            tree->Right = insert1(x, tree->Right);
        else if (x == tree->data)
            cout << "Element already exist" << endl;
        return tree;
    }

    void insertik(int data)
    {
        list = insert1( data, list);
    }
 Node * joinR( Node* tree, Node* tree1 ) { //функция ОБЪЕДИНЕНИЯ 
        if ( tree1 == NULL )
        {
            return tree;
        }
        if ( tree == NULL )
        {
            return tree1;
        }
        insert1(tree->data, tree ); // вставка в корень
        tree1->Left  = joinR( tree->Left,  tree1->Left );
        tree1->Right = joinR( tree->Right, tree1->Right );
        return tree1;
    }
    void join(Set listik) {
        list =joinR(listik.list, listik.list1);  }  
private:
    Node* list;
   Node* list1;
    };
void Set::left_to_right(Node *tree) {  //слева-направо симметричн in-order
    if (tree!=NULL) { //Пока не встретится пустой узел
        left_to_right(tree->Right); //Рекурсивная функция для правого поддерева
        cout <<" "<<tree->data;//Отображаем корень дерева
        left_to_right(tree->Left); //Рекурсивная функция для левого поддерева
    }
}
int main()
{
    Set *tree=new Set();
    Set *tree1=new Set();
int x, x1;
do {
                cin >> x;
                if (x) {
                    tree.insertik(x);
                }
            }while (x);
cout << "Enter another set" << endl;
            do {
                cin >> x1;
                if (x1) {
                    tree1.insertik(x1);
                }
            }while (x1);
           tree.join(tree1);
READ ALSO
c++ Как из вектора изьять значение

c++ Как из вектора изьять значение

Я с++ учу примерно месяца 4-5Много, очень много чего не знаю, и порошу о помощи)

107
Почему при неверном четвертом элементе строки у меня выводится &quot;Yes&quot;?

Почему при неверном четвертом элементе строки у меня выводится "Yes"?

Однажды Вася очень долго просидел на остановке, прежде чем дождался своего автобусаЧтобы как-то занять время, он решил записывать на листочке...

183
Как считать слово из области данных BIOS на C++

Как считать слово из области данных BIOS на C++

Как считать 2-байтное слово из области данных BIOS по адресу 0040:0010 на C/C++?

89
Как конвертировать pdf в doc и odt

Как конвертировать pdf в doc и odt

Я нашел много алгоритмов по конвертации doc в pdf,но не нашел обратного алгоритмаПодскажите пожалуйста как сделать это на windows и на linux

197