Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Бинарные деревья 
V
    Опции темы
DevilHell
Дата 4.12.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Предлагается использовать итерационный алгоритм прохождения по дереву. В качестве вспомогательного элемента используется стек. 
Дан код программы  для начала. Так вот никак не разберусь с вводом дерева. (чюдом ввести получается, но что вел не понятно).

А задание "Включение элемента в упорядоченное дерево на уровне листа." Как я понимаю дерево надо упорядочить, но как? С добавлением элемента вроде понятно. 

Помогите разобраться как вводить дерево и как упорядочить.

Код

program ds_04;
uses ds_unit;
var t:   ptree;
    cnt: integer;

procedure cnt_node(t:ptree; var cnt:integer);
{ Входы:     t     - бинарное дерево;
  Выходы:    cnt   - кол. элементов в дереве;
  Гл. имена: ptree - тип указателя на дерево;
             llink,rlink - поля связи элемента дерева;
  Функция: Определение кол. эл-тов cnt в дереве t.}
const m=32;                      { Размер стека }
var st:    array[1..m] of ptree;         { Стек }
    sp:    integer;           { Указатель стека }
    p:     ptree;    { Указатель текущего эл-та }
    empty: Boolean;     { Индикатор "Стек пуст" }
begin
    cnt:=0; sp:=0; p:=t;
    repeat
        while p<>nil do
        begin
            inc(sp); st[sp]:=p;
            p:=p^.llink;
        end;
        empty:=sp=0;
        if empty then exit;
        p:=st[sp]; dec(sp);
        inc(cnt);
        p:=p^.rlink;
    until false;
end; {cnt_node}

begin
    gentree(t);
    puttree(t);
    cnt_node(t,cnt);
    writeln('Количество элементов в дереве: ',cnt);
    escwait;
end.




Модуль DS_UNIT
Код

UNIT DS_UNIT;
interface
uses crt;
const m=7; { Размер блока памяти выделенного
             для представления списков }
var info: array[1..m] of integer;{ Массив полей информации }
    link: array[1..m] of integer;{ Массив полей связи для представления списков }
    avail: integer; { Список свободного пр-ва }

type plist = ^list; { Тип указателя на список }
    list = record  { Тип элемента списка }
        info: integer; { Поле информации }
        link: plist; { поле связи элеменета списка}
    end;

type ptree = ^tree; { Тип указателя на дерево }
     tree =  record { Тип элемента дерева }
             llink,rlink: ptree; { Левое и правое поля связи элемента дерева }
             info: char; {Поле информации элемента}
     end;                {         дерева         }

procedure escwait; { Приостановка выполнения программы }
procedure rdblock; { Ввод и                       }
procedure wrblock; { вывод состояния блока памяти }
                   { для представления списков    }
procedure rdlist(var lst: plist); { Ввод и        }
procedure wrlist(lst: plist);  { вывод списка lst }
procedure gentree(var t:ptree); { Ввод и          }
procedure puttree(t:ptree);     { вывод дерева t  }

implementation

procedure escwait;
var fin: Boolean;
begin
    writeln;
    writeln('Нажмите Esc для продолжения программы.');
    repeat
        repeat until keypressed;
        fin:=ord(readkey)=27;
    until fin;
end; {escwait}

procedure rdblock;
var i: integer;
begin
    writeln;
    writeln('Ввод состояния блока памяти...');
    writeln('  В строках Info и Link вводите по ',m:2,' чисел,');
    writeln('                        разделяя их пробелами...');
    write('      '); 
    for i:=1 to m do write(i:3);
    writeln; write('Info: '); 
    for i:=1 to m do read(info[i]);
    write('Link: '); 
    for i:=1 to m do read(link[i]);
    write('Avail: '); readln(avail); writeln;
end; {rdblock}

procedure wrblock;
var i: integer;
begin
    writeln; writeln('Состояние блока памяти...');
    write('      '); 
    for i:=1 to m do write(i:3);
    writeln; write('Info: '); 
    for i:=1 to m do write(info[i]:3); 
    writeln;
    write('Link: '); 
    for i:=1 to m do write(link[i]:3); 
    writeln; writeln('Avail: ',avail);
end; {wrblock}

procedure rdlist(var lst: plist);
var p,q,s: plist;
    buf: integer;
    function rdint(var buf:integer):Boolean;
    begin
        {$i-}
        read(buf);
        rdint:=IOResult=0;
        {$i+}
    end; {rdint}
begin
    writeln;
    writeln('Ввод списка... ');
    writeln('   Вводите элементы списка (целые числа),');
    writeln('   разделяя их пробелами. За последним');
    writeln('   числом списка введите пробел, точку и Enter!');
    q:=nil;
    while rdint(buf) do
    begin
        new(s);
        s^.info:=buf;
        s^.link:=q;
        q:=s;
    end;
    p:=nil;
    while q<>nil do
    begin
        s:=q; q:=q^.link;
        s^.link:=p; p:=s;
    end;
    lst:=p;
end; {rdlist}

procedure wrlist(lst: plist);
var p: plist;
begin
    write('Список: [');
    p:=lst;
    while p<>nil do
    begin
        if p<>lst then write(',');
        write(p^.info);
        p:=p^.link;
    end;
    writeln(']');
end; {wrlist}

procedure gentree(var t:ptree);
    procedure gent(var t:ptree);
    var ch: char;
    begin
        read(ch);
        if ch='.' then begin t:=nil; exit end;
        new(t); t^.info:=ch;
        gent(t^.llink);
        gent(t^.rlink);
    end; {gent}
begin
    writeln;
    writeln('Ввод дерева в точечной форме');
    writeln('          ( например,  AB..C.. )...');
    gent(t);
    readln;
    writeln;
end; {gentree}

procedure puttree(t:ptree);
    procedure putt(t:ptree);
    begin
        if t=nil then begin write('.'); exit end;
        write(t^.info);
        putt(t^.llink);
        putt(t^.rlink);
    end; {putt}
begin
    writeln;
    writeln('Дерево:');
    putt(t);
    writeln;
end; {puttree}
end.





PM MAIL   Вверх
DevilHell
Дата 4.12.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С вводом дерева разобрался. Объясните как упорядочить дерево. И что значит упорядочить. В инете не нашел что бы было все понятно раъяснено.
PM MAIL   Вверх
DevilHell
Дата 7.12.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Решил самостоятельно
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

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


 




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


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

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