#include <iostream>
using namespace std;
typedef enum {
NotEqual,
Less,
Equal,
Greater
} CompareResult;
template <typename _T>
struct CF {
typedef CompareResult (*CompareFunc)(const _T&, const _T&);
};
template <typename _T>
class avl_tree
{
protected:
typename CF<_T>::CompareFunc m_cf;
public:
avl_tree(typename CF<_T>::CompareFunc func) : m_cf(func), m_tree(nullptr) {}
};
CompareResult compare_int(const int& item1, const int& item2)
{
if (item1 < item2)
return Less;
if (item1 > item2)
return Greater;
return Equal;
}
int main()
{
avl_tree<int> int_tree(compare_int);
return 0;
}
Я также попробовал реализовать это дерево, но в нём нет строгой логики. Всё прекрасно, когда элементов 3. Но когда встаёт задача вставить четвёртый, то возникает вопрос, какую форму должна принять эта структура. А правило говорит, что ветви, исходящие от верхнего элемента должны различаться по высоте не более, чем на единицу.
Ну, допустим, что у нас 4 элемента. Можно изъять из дерева 1 элемент, из трёх выбрать верхний и как-то вставить четвёртый. Теоретически должно работать, но на практике такое решение может привести к тому, что будут варианты бесконечного изъятия лишних элементов, чтобы вставить их куда-то.
Нужно строгое правило, чтобы этого не происходило.