deadrime
@deadrime
Fullstack web developer

Как записать/прочитать дерево из файла?

Пишу алгоритм сжатия текстового документа методами Хаффмана и Шеннона-Фано.
Уже почти все готово - т.е создается дерево, по нему создаются коды для каждого символа и с их помощью кодируется текст.

Осталось только как-то записать и прочитать дерево, по которому можно будет расшифровать сообщение..

Вот структура для Шеннона-Фано:
struct spisok//список
{
	char ch;//символ
	string code;//код
	double k;//вероятность
	spisok *next;
}*myspisok=NULL;

struct tree //дерево
{
	tree *left,*right;
	spisok *s;//содержит в себе список
}*mytree=NULL;

Поясню - у каждого элемента дерева есть список, у листа этот список состоит всего из одного элемента, он то и нужен.
По сути можно вообще удалить все списки кроме списка у дерева.

Структура для Хаффмана вроде попроще -
struct spisok { //список деревьев FailFish
	char simvol;
	string code;
	int kol;
	spisok *next;
	spisok *prev;
	spisok *left;
	spisok *right;
}*head,*sortlist,*tree;

Тут *next и *prev не нужны, нужно записать, как я думаю, только simvol,*left,*right

Как это можно провернуть?

Функция расшифровки по дереву у меня такая -
for(int i=0;i<final_code.length();i++) 
	{
		if (k==size)//как только количество символов в расшифрованном файле будет равно количеству символов в исходном
		{
			break;
		}
		if (t->left == NULL && t->right == NULL)//дошли до листа
		{
			fwrite(&(t->s->ch),sizeof(char),1,decrypted);//записываем символ из листа
			cout<<t->s->ch;//выводим его 
			t=head;//поднимаемся назад к голове
			k++;
		}
		if (final_code[i]=='1') t=t->right;//если 1 - идем вправо
		else t=t->left;//иначе - влево
	}
  • Вопрос задан
  • 3671 просмотр
Решения вопроса 1
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
www.geeksforgeeks.org/serialize-deserialize-binary-tree

Лично я уже давно не использую указатели для деревьев, а пишу ноды в std::vector и вместо указателей - индекс на элемент массива. Сериализовать вектор - просто.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы