У меня есть struct element
, который включает информацию об элементе дерева.
struct element
{
char ch; //Letter
int left; //Number in array
int right; //Number in arry
int count; //Count letter in word
};
Также у меня есть функция MakeAlphabet
, которая создает алфавит для std::string
:
std::vector<element> MakeAlphabet(std::string str) //РАБОТАЕТ!
{
std::vector<element> alphabet;
ranges::sort(str);
for(auto ch : str | ranges::views::unique)
{
alphabet.push_back(element{ch, -1, -1, static_cast<int>(ranges::count(str, ch))});
}
return alphabet;
};
Наконец, у меня есть функция MakeBinaryTree
:
std::vector<element> MakeBinaryTree(std::string str)
{
std::vector<element> result;
std::vector<element> alphabet = MakeAlphabet(str);
std::sort(alphabet.begin(), alphabet.end());
result = alphabet;
int size = alphabet.size();
result = alphabet;
for(int i = 0; i < size; i+=2) //I think problem is here!
{
alphabet.push_back(element{-1, i, i+1, (alphabet[i].count + alphabet[i+1].count)});
alphabet.erase(alphabet.begin(), alphabet.begin() + 1);
result.push_back(*(alphabet.end()-1));
}
return result;
};
При проверке root результирующего дерева (оно должно соответствовать количеству букв в слове) результат почти всегда неверен.
UPD: у меня есть оператор перегрузки для std::sort(alphabet.begin(), alphabet.end());
.
bool operator<(const element &first, const element &second)
{
return (first.count < second.count);
}
bool operator==(const element &first, const element &second)
{
return (first.count == second.count);
}