Модераторы: volvo877, Snowy, MetalFan

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Двоичное дерево - вычисление характеристик 
:(
    Опции темы
BCworm
Дата 21.7.2008, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Приветствую!
У меня вот такая проблема. Необходимо написать процедуры для вычисления свойства двоичного дерева. Само дерево у меня вроде бы получается. обход с лева на право вроде тоже с выводом элементов. Но мне еще необходимо вычислить размер дерева, высоту дерева, и вычислить контрольную сумму. Естественно первым делом перечитал кучу одинаковых букварей и вот что удалось родить в муках. 

Код

Type // создаем новый тип определяющий дерево
  PVertex = ^TVertex;
  TVertex = Record
     Data : Integer;
     Left, Right : PVertex;
  end;

Var
  Root : PVertex;
  Digit, n: Integer;


Procedure InsTree(var ANode : PVertex; n : Integer); //вставки элемента в дерево
Begin
  if ANode = nil then
     Begin
       new(ANode);
       With ANode^ do
          Begin
            Left := nil;
            Right := nil;
            Data := n;
          end;
     end
  else if n< ANode^.Data then InsTree(ANode^.Left, n) else InsTree(ANode^.Right, n);
End;

Procedure Tsize(ANode: PVertex) //должна быть рекурсивная процедура вычисления размера дерева
begin
If (ANode=nil) then Tsize:=1
Else Tsize:=1+Tsize(ANode^.left)+Tsize(ANode^.Right);
End;

Procedure PrintTree(ANode : PVertex); //обход дерева слева на право
Begin
  if ANode <> nil then
     Begin
       PrintTree(ANode^.Left);
       WriteLn(ANode^.Data);
       PrintTree(ANode^.Right)
     End;
End;

BEGIN                       
  Writeln('Enter unti -0');
  Root := nil;
  Read(Digit);
  While Digit<>0 Do
     Begin
       InsTree(Root,Digit);
       Write('Enter the next number: ');
       ReadLn(Digit);
     End;
  PrintTree(Root);
  readln;
END.



У меня есть схема необходимых алгоритмов на псевдокоде но я никак не могу до конца его понять.
Помогите пожалуйста.
Вот к примеру алгоритм вычисления размера дерева

Определение размера дерева. Видно что используется рекурсия. Моя интерпритация -это процедура TSize но конечно же не все так просто.

Size(p:pVertex)
IF(p = NIL) := 0
ELSE Size := 1 + Size (pLeft)+ Size (pRight)
FI 

Код

Procedure Tsize(ANode: PVertex)
begin
If (ANode=nil) then Tsize:=1
Else Tsize:=1+Tsize(ANode^.left)+Tsize(ANode^.Right);
End;


А вот к примеру определение высоты дерева
Height(p:pVertex)
IF(p = NIL) Height := 0
ELSE Height := 1+ max(Height(pLeft), Height(pRight))

В общем очевидно что мы с компилятором имеем разные мнения о правильности написания кода smile. Подсобите кто нибудь а?  

PM MAIL   Вверх
Dobermann
Дата 21.7.2008, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



У тебя не дерево - это двунаправленный список!!!
PM   Вверх
BCworm
Дата 21.7.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Я делал по этому псевдокоду. Где ошибка то? Или в добавлении элемента к дереву?

type pVertex = ^tVertex;
Vertex =record; tData: integer;
    Left: pVertex;
    Right: pVertex;
end;
VAR Root: pVertex; 
PM MAIL   Вверх
Dobermann
Дата 21.7.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Я тебе говорю, в деревьях добавляется еще и индекс элемента!!! Иначе какой обход?!?!?!
PM   Вверх
BCworm
Дата 22.7.2008, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Хм.  Уже везде все перерыл но нигде не нашел про индексы. Нашел еще несколько примеров инициализации, построения и обхода дерева но все они принципиально одинаковы только названия переменных разные. К примеру вот это http://www.rusedu.info/Article520.html
Уже не знаю чему верить :(
PM MAIL   Вверх
Dobermann
Дата 22.7.2008, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Забудь! Индексы добавляются для поиска!
PM   Вверх
BCworm
Дата 22.7.2008, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Во! я вот тоже седня читал читал, какието намеки были smile
Но это проблемы не решает. Мне бы с процедурами разобраться. о которых я выше писал. размер дерева высота. Проблема очевидно в том что неправильно интерпретирую псевдокод. 
К примеру вот

Size(p:pVertex)
IF(p = NIL) := 0
ELSE Size := 1 + Size (pLeft)+ Size (pRight)
FI 

Я вот написал вот так. но в чем моя ошибка? Естественно размер дерева нужно будет потом вывести.
А как? write(Tsize) явно не так :(

Код

Procedure Tsize(ANode: PVertex)
begin
If (ANode=nil) then Tsize:=1
Else Tsize:=1+Tsize(ANode^.left)+Tsize(ANode^.Right);
End;

PM MAIL   Вверх
Dobermann
Дата 22.7.2008, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Добавь тогда индекс для подсчёта высоты...
Т.е. с каждым номым обходом добавляй единицу.
Размер дерева - кол-во его узлов???
PM   Вверх
volvo877
Дата 22.7.2008, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(BCworm @  22.7.2008,  07:01 Найти цитируемый пост)
Естественно размер дерева нужно будет потом вывести.
Естественно... Вот и выведешь:
Код

Writeln(TSize(root)); { root - корень дерева }
Только как ты собрался процедуру использовать в выражении? Может, все-таки:
Код

Function Tsize(ANode: PVertex): Integer;
...
?

P.S.
Не надо никаких дополнительных индексов, высота прекрасно считается и без них...

PM MAIL   Вверх
BCworm
Дата 22.7.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Ну вот же. Вот же оно! Вроде начинаю прояснятся!
PM MAIL   Вверх
Dobermann
Дата 22.7.2008, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Цитата(volvo877 @  22.7.2008,  08:18 Найти цитируемый пост)
Не надо никаких дополнительных индексов, высота прекрасно считается и без них...

Я не имел ввиду добавить в элемент записи еще одну integer'овскую переменную....
PM   Вверх
BCworm
Дата 23.7.2008, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Ну вот дошло дело и до определения высоты дерева. Там нужно использовать функцию судя по всему там нужно использовать функцию  max. 

Я написал вот такую функцию. Даже при подключенном math судя по всему нужно объяснить компилятору что означает буквосочетание  max в моем коде. А как?
Код

uses math;
...
function MSize(ANode: PVertex):integer;
begin
If ANode=nil then MSize:=0
Else MSize:=1+max(Msize(ANode^.left),MSize(ANode^.Right));
End;

PM MAIL   Вверх
volvo877
Дата 23.7.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(BCworm @  23.7.2008,  08:17 Найти цитируемый пост)
Даже при подключенном math

Разделом не ошибся? Где ты в стандартном Паскале видел модуль Math?

Напиши свою функцию:
Код

function max(a, b: integer): integer;
begin
  max := b;
  if a > b then max := a;
end;

Цитата(BCworm @  23.7.2008,  08:17 Найти цитируемый пост)
что означает буквосочетание  max в моем коде.
Можно уточнить, откуда у тебя этот "твой" код? Ибо если ты не знаешь, что в "твоем" коде означает max, то этот код совсем не твой, а скопированный тобой... Не присваивай себе чужого никогда...
PM MAIL   Вверх
BCworm
Дата 24.7.2008, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Цитата(volvo877 @  23.7.2008,  11:24 Найти цитируемый пост)
Можно уточнить, откуда у тебя этот "твой" код? Ибо если ты не знаешь, что в "твоем" коде означает max, то этот код совсем не твой, а скопированный тобой... Не присваивай себе чужого никогда... 



Да я по псевдокоду это все сочиняю поэтому вот увидел там max и подумал что надо эту функцию использовать. Порыл гугль а там вроде как написано что есть некий модуль math... smile
PM MAIL   Вверх
BCworm
Дата 25.7.2008, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



И опять тупик. Осталось вычислить среднюю высоту дерева. А у меня нет ни псевдокода ни примера ни даже малейшего намека как это сделать :(. Гугль молчит. Может можно где нить почитать? 
Рассуждая логически предположу что если высота дерева это длинна самой длинной ветки, то средняя высота эта наверное сумма всех этих путей со всех веток поделенная ... а на что поделенная то? на корень дерева? на количество ветвей? нигде ничего толком как будто я сам все это придумал и до меня никого это не волновало :(
PM MAIL   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0976 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.