Реализую отд множество с использованием бинарного дерева поиска. Столкнулась с такой проблемой: как реализовать в данном случае операции пересечение/ объединение / разницу? (Ниже пыталась сделать объединение, но что-то явно не то. Буду рада любой помощи!
#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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Я с++ учу примерно месяца 4-5Много, очень много чего не знаю, и порошу о помощи)
Однажды Вася очень долго просидел на остановке, прежде чем дождался своего автобусаЧтобы как-то занять время, он решил записывать на листочке...
Как считать 2-байтное слово из области данных BIOS по адресу 0040:0010 на C/C++?
Я нашел много алгоритмов по конвертации doc в pdf,но не нашел обратного алгоритмаПодскажите пожалуйста как сделать это на windows и на linux