Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2009, 14:10   #1
Xe-Xe
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 16
По умолчанию печать двоичных деревьев в Treeview

В общем начал изучать деревья.. и проблема не понимаю как их выводить. Точнее программа работает но я не понимаю почему неправильно в одном моменте
Код:
type Tnode=^Node;
        Node=Record
        Inf:String;
        Left,Right:Tnode;
     End;

Function Tree(K,i,ur:Integer; StringGrid: TStringGrid;treeview:Ttreeview):Tnode;
Var
  NewNode:Tnode;
  X:String;
  Nl,Nr:Integer;
Begin
  If K=0
    Then Tree:=Nil
    Else
      Begin
        Nl:=K Div 2;
        Nr:=K-Nl-1;
        i:=sm;
        X:=StringGrid.cells[i,0];
           with TreeView do
   begin
      if ur=-1 then
        Items.Add( nil, x )
      else
         Items.AddChild( Items[ur], x );
   end;
        inc(i);
        sm:=i;
        New(NewNode);
        With NewNode^ Do
          Begin
            Inf:=X;
                inc(ur);
            Left:=Tree(Nl,i,ur,StringGrid,treeview);
            level:=true;
            Right:=Tree(Nr,i,ur,StringGrid,treeview);
          End;
        Tree:=NewNode;
      End;
End;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  StringGrid1.ColCount:=StrToInt(edit1.Text);
end;

procedure TForm1.Button1Click(Sender: TObject);
var n: integer; i: integer;  Root: Tnode;
begin
  TreeView1.Items.Clear;
  memo1.clear;
  n:=StrToInt(edit1.Text);
  i:=0;
  sm:=0;
  level:=false;
  Root:=Tree (n,i,-1,StringGrid1,treeview1);
в общем вводим 5 вершин. 1 2 3 4 5
должно получится дерево
1
2 4
3 5

а получается
1
2 4
3 5

не знаю почему..помогите?

14:32

вот файл с программой

У нас принято оформлять код специальным тэгом - кнопочка "#".
Модератор

У нас принято пользоваться кнопочкой "Правка", дабы не плодить посты подряд, друг за другом.
Модератор


Читаем и начинаем понимать:
http://programmersclub.ru/files/book1_100comp.rar
Вложения
Тип файла: rar Копия лаб6зад30.rar (206.4 Кб, 13 просмотров)

Последний раз редактировалось mihali4; 13.12.2009 в 14:58.
Xe-Xe вне форума Ответить с цитированием
Старый 13.12.2009, 16:22   #2
Xe-Xe
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 16
По умолчанию

да читал я эту статью. так бы смог я эту прогу написать?))
я понять не могу в чем ошибка..
вот для примера 1 2 3 4 5
Код:
TreeView1.Items.Item[nil]=1
TreeView1.Items.Item[0]= 2, 4
TreeView1.Items.Item[1]=3 , 5
ну почему из 1 элемента списка идут дочерние "2","4" , а из "2" - "3", "5" , когда из "4" должна "5" выходить а из элемента "2" - значение "3"??
надеюсь нормально обьяснил?))

Код:
TreeView1.Items.AddChild(TreeView1.Items.Item[0], 'цех 1');
TreeView1.Items.AddChild(TreeViewl.Items.Item[0], 'цех 2');
TreeView1.Items.AddChild(TreeView1.Items.Item[0], 'цех 3');

Дерево может быть сколь угодно разветвленным. Например, следующие операторы добавляют дочерние узлы «бригада 1» и «бригада 2» в сформированный ранее узел «цех 1»: 

TreeView1.Items.AddChild(TreeView1.Items.Item[1], 'бригада 1');
TreeView1.Items.AddChild(TreeView1.Items.Item[l], 'бригада 2');
цитата из примера.. а почему дочерние узлы бригада 1,2 добавляются к цеху 1 а не к остальным? почему не к цеху 3?

Последнее предупреждение:
У нас принято оформлять код специальным тэгом - кнопочка "#".
Модератор

Последний раз редактировалось mihali4; 13.12.2009 в 16:32.
Xe-Xe вне форума Ответить с цитированием
Старый 13.12.2009, 16:29   #3
Nowar
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 23
По умолчанию

А можете сформулировать, что программа должна делать?
Nowar вне форума Ответить с цитированием
Старый 13.12.2009, 16:33   #4
Xe-Xe
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 16
По умолчанию

"нарисовать" дерево, с заданными в стрингриде вершинами ,в компоненте treeview

Последний раз редактировалось mihali4; 14.12.2009 в 02:39.
Xe-Xe вне форума Ответить с цитированием
Старый 13.12.2009, 19:33   #5
Nowar
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 23
По умолчанию

Как задавать в стринггриде вершины дерева? Какие ограничения наложены на дерево? Дерево двоичное?

Последний раз редактировалось mihali4; 14.12.2009 в 11:42.
Nowar вне форума Ответить с цитированием
Старый 14.12.2009, 02:36   #6
Xe-Xe
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 16
По умолчанию

вы в моей проге посмотрите процедурку tree
там и задаются вершины через стрингрид.
дерево да двоичное)
Xe-Xe вне форума Ответить с цитированием
Старый 14.12.2009, 02:42   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
в общем вводим 5 вершин. 1 2 3 4 5
должно получится дерево
1
2 4
3 5

а получается
1
2 4
3 5

не знаю почему..помогите?
Абсолютное совпадение.
Троллить у нас запрещено. Вы не знали?
"Ща" забаню...
mihali4 вне форума Ответить с цитированием
Старый 14.12.2009, 10:24   #8
Nowar
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Xe-Xe Посмотреть сообщение
вы в моей проге посмотрите процедурку tree
там и задаются вершины через стрингрид.
дерево да двоичное)
Я про это и пишу! У Вас что-то не работает, я прошу объяснить, как в стринггриде задавать деревья (двоичные), Вы просите меня смотреть алгоритм в Вашей программе.
В таком случае:
1) Можно утверждать, что у Вас всё в порядке, т.к. Ваша программа работает именно так, как написано в Вашей программе.
2) То чем мы занимаемся, действительно троллинг. Хотя мне кажется, нужно просто в правила пунктик добавить. Не насчёт троллинга, а насчёт обязательности формулирования исходной задачи.
Nowar вне форума Ответить с цитированием
Старый 07.06.2010, 20:35   #9
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Если выводишь просто для себя, то вот процедурка.
Код:
procedure altprint(var Root:ptree);
var
  res1,res2,res3:ptree;
begin
  res1:=Root;
  res2:=Root;
  res3:=Root;
  writeln;
  writeln;
  writeln('Elem= ',Root^.sod);
  writeln('to the right');
  while Root^.R<>nil do
    begin
      Root:=Root^.R;
      write(Root^.sod,', ');
    end;
  writeln;

  Root:=res1;
  writeln('to the left');
  while Root^.L<>nil do
  begin
    Root:=Root^.L;
    write(Root^.sod,', ');
  end;
  if res2^.R<>nil then altprint(res2^.R);
  if res3^.L<>nil then altprint(res3^.L);
  Root:=res3;
end;
После останется только взять ручку и бумагу и тупо нарисовать.

P.S. возможно процедуру можно упростить, но лень думать, ибо работает.
Все тривиальное просто
whatever вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сложение 10 двоичных чисел sssvetlaya Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 10.11.2009 09:32
TreeView (на печать) Delphi VadEr Помощь студентам 2 02.11.2009 10:47
Код для расшировки двоичных слов slon_slon_slon Общие вопросы C/C++ 0 11.10.2009 17:42
печать=> TreeView Asadullo Компоненты Delphi 4 26.03.2007 13:37