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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2010, 22:23   #1
Sianessa
Форумчанин
 
Регистрация: 18.01.2009
Сообщений: 144
По умолчанию Delphi: Двоичное упорядоченное дерево.

Люди, помогите пожалуйста!
Написано дерево, надо сделать следующие вещи с ним, не знаю как:
Его элементы должны занимать 10 кб.
Нужно написать обработчики кнопок:
- проверить, дерево пусто/не пусто;
- добавить элемент в дерево;
- удалить элемент из дерева;
- найти элемент с заданным значением;
- опустошить дерево.

Вот исходный код и сам исходник:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;


type
  PNode=^TNode;

  TNode=record
    nKey:Integer;
    nCount:integer;
    pLeft:pNode;
    pRight:pNode;
  end;

  TTree=class
  private
  public
    fTree:pNode;
    procedure Search(x:integer;var node:PNode);
    constructor Create;
  end;

  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Edit1: TEdit;
    Button6: TButton;
    Button7: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Vyvod(node:PNode;item:TTreeNode);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  t:TTree;

implementation

constructor TTree.Create;
begin
  fTree:=nil;
end;

procedure TTree.Search(x: Integer; var node: PNode);
//  Поиск вершины с ключом x в дереве со вставкой
//             (рекурсивный алгоритм).
begin
  if node=nil  then
  // Вершины в дереве нет; включить ее.
  begin
    node:=new(PNode);
    with node^ do begin
      nKey:=x;
      nCount:=1;
      pLeft:=nil;
      pRight:=nil;
    end;
  end
  else
    if x<node^.nKey then
      Search(x,node^.pLeft)
    else
      if x>node^.nKey then
        Search(x,node^.pRight)
      else
        inc(node^.nCount);
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
begin
  randomize;
  t:=TTree.Create;
  for I := 0 to 9 do
    t.Search(random(100),t.fTree);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  item:TTreeNode;
begin
  item:=nil;
  Vyvod(t.fTree,item);
end;


procedure TForm1.Vyvod(node:PNode;item:TTreeNode);
var
  tmpItem:TTreeNode;
begin
  if node <> nil then begin
    tmpItem:=TreeView1.Items.AddChild(item,inttostr(node^.nKey));
    vyvod(node^.pLeft,tmpItem);
    vyvod(node^.pRight,tmpItem);
  end;
end;
end.
Подскажите пожалуйста.
Вложения
Тип файла: rar Копия Дерево - 1.rar (178.1 Кб, 39 просмотров)
Sianessa вне форума Ответить с цитированием
Старый 26.11.2010, 09:16   #2
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Цитата:
Его элементы должны занимать 10 кб.
Каждый элемент или все вместе?

Цитата:
Двоичное упорядоченное дерево
Упорядоченное в смысле сбалансированное?
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 26.11.2010, 11:41   #3
Sianessa
Форумчанин
 
Регистрация: 18.01.2009
Сообщений: 144
По умолчанию

Цитата:
Упорядоченное в смысле сбалансированное?
Да.

Цитата:
Каждый элемент или все вместе?
Все вместе.

Вот сколько ищу - про килобайты вообще ничё найти никак не могу, как это регулировать? =__=
Sianessa вне форума Ответить с цитированием
Старый 26.11.2010, 12:16   #4
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Цитата:
Вот сколько ищу - про килобайты вообще ничё найти никак не могу, как это регулировать?
Сосчитай сколько занимает памяти один узел ( структура TNode). Раздели 10 Кб на это число получишь количество вершин которые надо добавить в дерево, чтобы оно занимало в памяти 10Кб.

Если типы Integer и указатель PNode имеют длину 2 байта в твоей версии языка Pascal, то узел занимает 2 * 4 = 8 байт. А если по 4 байта, то 4*4 = 16 байт

Код:
type
  PNode=^TNode;

  TNode=record
    nKey:Integer;
    nCount:integer;
    pLeft:pNode;
    pRight:pNode;
  end;
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 26.11.2010, 12:33   #5
Sianessa
Форумчанин
 
Регистрация: 18.01.2009
Сообщений: 144
По умолчанию

Z1000000, эээ... А как мне узнать сколько байт занимает типы Integer и указатель PNode ? =__=

У меня Borland Delphi 7...

Последний раз редактировалось Sianessa; 26.11.2010 в 12:40.
Sianessa вне форума Ответить с цитированием
Старый 26.11.2010, 12:48   #6
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

4 байта и то, и другое. В помощи к Дельфи можно найти эту информацию. См. информацию о типах данных: Integer, Pointer.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 26.11.2010, 12:56   #7
Sianessa
Форумчанин
 
Регистрация: 18.01.2009
Сообщений: 144
По умолчанию

Z1000000, благодарю, не догадалась...
Значит 16 байт занимает 1 узел...

Т.е. это будет: 10 Килобайт = 10240 байт

10240/16 - 640 узлов... Всё верно?

Всё у меня вроде как получилось, сделала:

Код:
 for I := 0 to 640 do
    t.Search(random(100),t.fTree);
end;
А как теперь операции все эти делать с этим деревом?
Sianessa вне форума Ответить с цитированием
Старый 26.11.2010, 13:03   #8
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Цитата:
Всё у меня вроде как получилось, сделала:
Неправильно ты сделала. Эта процедура ищет узлы, а у тебя их нет еще. Чего искать? Сначала их добавить в дерево надо.

Цитата:
А как теперь операции все эти делать с этим деревом?
В Инете информации по двоичным деревьям, добавлением в них узлов и балансировке очень много.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 26.11.2010, 13:14   #9
Sianessa
Форумчанин
 
Регистрация: 18.01.2009
Сообщений: 144
По умолчанию

Z1000000, цифру эту некуда вставлять больше...
И потом, вот полный обработчик кнопки, который рандомно создаёт 640 узлов:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
begin
  randomize;
  t:=TTree.Create;
  for I := 0 to 640 do
    t.Search(random(100),t.fTree);
end;
А по нажатию второй кнопки дерево выводится на экран:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  item:TTreeNode;
begin
  item:=nil;
  Vyvod(t.fTree,item);
end;
Цитата:
В Инете информации по двоичным деревьям, добавлением в них узлов и балансировке очень много.
Они все как-то непонятно написаны, и большинство - под консоль.
А я не знаю, как с моей формой сделать, чтобы работало...
Sianessa вне форума Ответить с цитированием
Старый 26.11.2010, 13:28   #10
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Цитата:
Z1000000, цифру эту некуда вставлять больше...
И потом, вот полный обработчик кнопки, который рандомно создаёт 640 узлов:
Да все правильно. Я ошибся.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двоичное дерево (С++) Dead Romantic Помощь студентам 0 30.05.2010 23:52
Двоичное дерево yagluboko Помощь студентам 0 17.04.2010 11:28
Двоичное дерево на си++ fesked Помощь студентам 0 22.10.2009 23:44
двоичное дерево s20 Помощь студентам 0 22.10.2009 03:51
Двоичное дерево afeg Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2008 14:49