Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

(Паскаль) Дерево Хаффмана

29K
12 мая 2008 года
Rifler
24 / / 12.05.2008
Здравствуйте!
У меня есть бинарное дерево, в нём мне нужно найти лист. Это дерево - НЕ дерево поиска, то есть значение левого поддерева не обязательно меньше корня, а правого - больше.
Помогите пожалуйста
360
12 мая 2008 года
P*t*
474 / / 15.02.2007
А можно подробнее?

Какие параметры листа даны?
29K
12 мая 2008 года
Rifler
24 / / 12.05.2008
Цитата: P*t*
А можно подробнее?

Какие параметры листа даны?


У листа два поля info - символ, и count - кол-во этого символа(ну не считая left, right и тд). Вот.
Нужно искать лист по символу.

391
12 мая 2008 года
Archie
562 / / 03.02.2005
Так заведи себе таблицу (массив) указательей на листься дерева, где индекс массива будет код символа. А вообще в инете полно исходников про код Хаффмана, смотрел?
29K
12 мая 2008 года
Rifler
24 / / 12.05.2008
Цитата: Archie
Так заведи себе таблицу (массив) указательей на листься дерева, где индекс массива будет код символа. А вообще в инете полно исходников про код Хаффмана, смотрел?


Да, я глядел, но нашел только по теории. Буду благодарен за хорошую ссылочку:).Я делал в помощью списка.
С массивом не подойдет, так мне от найденного листа потом нужно будет подниматься вверх до корня, чтобы узнать код символа

9.4K
13 мая 2008 года
AIGrifon
165 / / 13.11.2007
Цитата: Rifler
Я делал в помощью списка.
С массивом не подойдет, так мне от найденного листа потом нужно будет подниматься вверх до корня, чтобы узнать код символа



Можно использовать массив указателей на листья. Перейдя по указателю оказываемся в листе и далее можно подниматься вверх, используя указатель parent на родителя (он ведь есть?). Также можно организовать и список.

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

360
13 мая 2008 года
P*t*
474 / / 15.02.2007
На мой взгляд в этом случае самая удобная организация дерева - в виде одного массива:
lists[0] - корень
lists[a*2+1] - левый потомок А
lists[a*2+2] - правый потомок А

Подниматься вверх до корня элементарно:
 
Код:
while (now<>0) do
begin
   now = (now - 1) div 2;
   {теперь lists[now] - очередная вершина на пути к корню}
end;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог