Как сделать дерево в delphi

деревокак сделать дерево в delphi
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl→      все
chibor
Member
Откуда: Новосибирск
Сообщений: 7
Доброго времени суток кодеры и просто обиталели данного форума!
Прошу Вас помочь мне разобраться в представлении бинарного дерева в Delphi.
Я пытался использовать компонент TreeView. Но не знаю как программно добавить SubItem. Да и в обще не знаком с этим компонентом, подскажите как пользоваться TreeView или ссылочку про это.
Или лучше использовать какой-нибудь другой компонет, если да то какой?
mv
Member
Откуда:
Сообщений: 8884
Используй грид. Считай, что это вырожденное дерево. С одним уровнем.
chibor
Member
Откуда: Новосибирск
Сообщений: 7
А чуть по пободробнее можно? И что такое вырожденое дерево?
Anatoly Podgoretsky
Member
Откуда:
Сообщений: 62928
Вырожденое дерево, это вектор.
mv
Member
Откуда:
Сообщений: 8884
Не обращай внимания. Это выходные + погода.

А вообще почитай книжку
Джулиан М.Бакнелл
"Фундаментальные алгоритмы и структуры данных в Delphi"

Или теорию ты знаешь, а отобразить не можешь?

chibor
Member
Откуда: Новосибирск
Сообщений: 7
В разработке приложения меня очень тормозит вопрос: как программно добавить SubItem в TTreeView?
chibor
Member
Откуда: Новосибирск
Сообщений: 7
Теорию я в принципе знаю, вот только с отображением проблемы!
А ссылочку на книгу не подкинешь?
Dmitry Arefiev
Member
Откуда:
Сообщений: 9503
Привет!

Где тут SubItems? Тут Items! :)

Смотри TCustomTreeView.Items.AddXXXXX методы. Например:

MyTree.Items.AddChild(MyParentNode, 'child 1'); MyTree.Items.AddChild(MyParentNode, 'child 2');

Удачи,
Дмитрий
--
AnyDAC (www.da-soft.com) - Oracle, MySQL, MSSQL, MSAccess, IBM DB2,
Sybase ASA, DbExpress, ODBC freeware data access framework.
chibor
Member
Откуда: Новосибирск
Сообщений: 7
[quot Dmitry Arefiev [gs-soft.ru]]Привет!

Где тут SubItems? Тут Items! :)

Смотри TCustomTreeView.Items.AddXXXXX методы. Например:

MyTree.Items.AddChild(MyParentNode, 'child 1'); MyTree.Items.AddChild(MyParentNode, 'child 2');

Удачи,
Дмитрий
--
AnyDAC (www.da-soft.com) - Oracle, MySQL, MSSQL, MSAccess, IBM DB2,
Sybase ASA, DbExpress, ODBC freeware data access framework.
[/quot]
Извеняюсь за ламерский вопрос, но что писать под "MyParentNode"? Для создания Item я использовал TreeView1.Items.add(nil, 'text')
Dmitry Arefiev
Member
Откуда:
Сообщений: 9503
То что ты написал, это ты добавил корень в дерево, когда вызвал
этот код первый раз. Его всегда можно найти - TCustomTreeView. Item[0].
От него все и растет и тебе дерево от него растить...

--
AnyDAC (www.da-soft.com) - Oracle, MySQL, MSSQL, MSAccess, IBM DB2,
Sybase ASA, DbExpress, ODBC freeware data access framework.

asd123123adsad12312
Guest
chibor
Доброго времени суток кодеры и просто обиталели данного форума!
Прошу Вас помочь мне разобраться в представлении бинарного дерева в Delphi.
Я пытался использовать компонент TreeView. Но не знаю как программно добавить SubItem. Да и в обще не знаком с этим компонентом, подскажите как пользоваться TreeView или ссылочку про это.
Или лучше использовать какой-нибудь другой компонет, если да то какой?
kasper_
Member
Откуда: где-то рядом
Сообщений: 625
Node1 := Add(nil, - корень
Node2 := AddChild(Node1, - потомок

Node1, Node2 определить как переменные TTreeNode.

Kast22
Guest
Можно ещё проще!
Item: TreeView1.Items.Add(nil, '1');
SubItem: TreeView1.Items.AddChild(TreeView1.Selected, '2');
Dipish
Member
Откуда:
Сообщений: 103
Дайте плиз рекурсивный алгоритм вывода дерева в TTreeview! Я че-то сообразить не могу =(
MazoHist
Guest
Про бинарные деревья можно посмотреть тут. Я по этому материалу делал работу одному товарищу, правда без TTreeView... Но если нужно, результатами могу поделиться.
Dipish
Member
Откуда:
Сообщений: 103
MazoHist можешь все-таки поделиться? И желательно на Delphi! На данный момент у меня сложность с выводом бинарного дерева в компонент TTreeView (обходя его рекурсивно)
MazoHist
Guest
Уходя с работы, забыл исходники... Пришлось писать все заново...
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; 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.

К сообщению приложен файл. Размер - 0Kb
Mamka
Member
Откуда:
Сообщений: 1
Здравствуйте. Очень нужны исходники программы с созданием бинарного дерева и желательно процедур действий над ним. Горит курсовая, а с созданием деревьев разобраться не смогла. Программа на делфях. Заранее спасибо.
Tosh
Member
Откуда: Vladivostok
Сообщений: 2945
Увы, но с такой постановкой вопроса - вам проще пойти в форум "Работа" и указать сколько вы за это готовы платить... если вы не готовы что-то делать сами - бесплатно никто ничего делать не будет - здесь могут помочь советом или куском кода для автора, который сам что-то делает, но не бездельнику
MazoHist
Guest
>Очень нужны исходники программы с созданием бинарного дерева и желательно процедур действий над ним
Задание что-то очень знакомое... Когда-то я делал такое...
2Mamka Цена вопроса - 1000 р. Торг в разумных пределах уместен. Если интересно - могу на мыло скинуть исполняемый модуль, чтобы посмотреть, подойдет ли.
Между сообщениями интервал более 1 года.
RinOS
Member
Откуда:
Сообщений: 58
unit mAVLTree; interface type TAVLTree = class; TAVLTreeNode = class (TObject) private FKey: Cardinal; FData: TObject; FBalance, FLeftBalance, FRightBalance: Byte; FLeft, FRight, FParent: TAVLTreeNode; FOwner: TAVLTree ; procedure RefreshBalance; public constructor Create(AOwner: TAVLTree ; AKey: Cardinal; AData: TObject; AParent: TAVLTreeNode); destructor Destroy; override; function GetNext(AKey: Cardinal): TAVLTreeNode; property Key: Cardinal read FKey write FKey; property Data: TObject read FData write FData; property Parent: TAVLTreeNode read FParent write FParent; property Left: TAVLTreeNode read FLeft write FLeft; property Right: TAVLTreeNode read FRight write FRight; property Balance: Byte read FBalance; property LeftBalance: Byte read FLeftBalance; property RightBalance: Byte read FRightBalance; end; TAVLTree = class (TObject) private FRoot: TAVLTreeNode; FOwnedObjects: Boolean; procedure Balance(const ANode: TAVLTreeNode); public constructor Create(AOwnedObjects: Boolean); destructor Destroy; override; function IsEmpty: Boolean; function FindData(AKey: Cardinal): Pointer; function FindNode(AKey: Cardinal): TAVLTreeNode; function FindOrInsert(AKey: Cardinal; AData: TObject): TAVLTreeNode; function Delete(AKey: Cardinal): Boolean; procedure Clear; property Root: TAVLTreeNode read FRoot write FRoot; end; implementation uses SysUtils; { TAVLTreeNode } procedure TAVLTreeNode.RefreshBalance; begin if Assigned(Left) then FLeftBalance := Left.Balance else FLeftBalance := 0; if Assigned(Right) then FRightBalance := Right.Balance else FRightBalance := 0; if RightBalance > LeftBalance then FBalance := RightBalance + 1 else FBalance := LeftBalance + 1; end; constructor TAVLTreeNode.Create(AOwner: TAVLTree ; AKey: Cardinal; AData: TObject; AParent: TAVLTreeNode); begin inherited Create; FKey := AKey; FData := AData; Parent := AParent; FBalance := 1; FOwner := AOwner; end; destructor TAVLTreeNode.Destroy; begin if FOwner.FOwnedObjects then FreeAndNil(FData); inherited; end; function TAVLTreeNode.GetNext(AKey: Cardinal): TAVLTreeNode; begin if Key > AKey then Result := Left else Result := Right; end; { TAVLTree } procedure TAVLTree.Balance(const ANode: TAVLTreeNode); var NodeA, NodeB, NodeC, CurrentNode: TAVLTreeNode; begin CurrentNode := ANode; while Assigned(CurrentNode) do begin CurrentNode.RefreshBalance; if Abs(CurrentNode.LeftBalance - CurrentNode.RightBalance) <= 1 then CurrentNode := CurrentNode.Parent else if CurrentNode.RightBalance > CurrentNode.LeftBalance then begin if CurrentNode.Right.LeftBalance > CurrentNode.Right.RightBalance then begin NodeA := CurrentNode; NodeB := NodeA.Right; NodeC := NodeB.Left; NodeC.Parent := NodeA.Parent; if Assigned(NodeC.Parent) then if NodeC.Parent.Right = NodeA then NodeC.Parent.Right := NodeC else NodeC.Parent.Left := NodeC; NodeA.Parent := NodeC; NodeB.Parent := NodeC; NodeA.Right := NodeC.Left; if Assigned(NodeA.Right) then NodeA.Right.Parent := NodeA; NodeC.Left := NodeA; NodeB.Left := NodeC.Right; if Assigned(NodeB.Left) then NodeB.Left.Parent := NodeB; NodeC.Right := NodeB; NodeA.RefreshBalance; NodeB.RefreshBalance; NodeC.RefreshBalance; if Root = NodeA then Root := NodeC; CurrentNode := NodeC.Parent; end else begin NodeA := CurrentNode; NodeB := NodeA.Right; NodeB.Parent := NodeA.Parent; if Assigned(NodeB.Parent) then if NodeB.Parent.Right = NodeA then NodeB.Parent.Right := NodeB else NodeB.Parent.Left := NodeB; NodeA.Parent := NodeB; NodeA.Right := NodeB.Left; if Assigned(NodeA.Right) then NodeA.Right.Parent := NodeA; NodeB.Left := NodeA; NodeA.RefreshBalance; NodeB.RefreshBalance; if Root = NodeA then Root := NodeB; CurrentNode := NodeB.Parent; end end else begin if CurrentNode.Left.RightBalance>CurrentNode.Left.LeftBalance then begin NodeA := CurrentNode; NodeB := NodeA.Left; NodeC := NodeB.Right; NodeC.Parent := NodeA.Parent; if Assigned(NodeC.Parent) then if NodeC.Parent.Right = NodeA then NodeC.Parent.Right := NodeC else NodeC.Parent.Left := NodeC; NodeA.Parent := NodeC; NodeB.Parent := NodeC; NodeA.Left := NodeC.Right; if Assigned(NodeA.Left) then NodeA.Left.Parent := NodeA; NodeC.Right := NodeA; NodeB.Right := NodeC.Left; if Assigned(NodeB.Right) then NodeB.Right.Parent := NodeB; NodeC.Left:=NodeB; NodeA.RefreshBalance; NodeB.RefreshBalance; NodeC.RefreshBalance; if Root = NodeA then Root := NodeC; CurrentNode := NodeC.Parent; end else begin NodeA := CurrentNode; NodeB := NodeA.Left; NodeB.Parent := NodeA.Parent; if Assigned(NodeB.Parent) then if NodeB.Parent.Right = NodeA then NodeB.Parent.Right := NodeB else NodeB.Parent.Left := NodeB; NodeA.Parent := NodeB; NodeA.Left := NodeB.Right; if Assigned(NodeA.Left) then NodeA.Left.Parent := NodeA; NodeB.Right := NodeA; NodeA.RefreshBalance; NodeB.RefreshBalance; if Root = NodeA then Root := NodeB; CurrentNode:=NodeB.Parent; end end; end; end; constructor TAVLTree.Create(AOwnedObjects: Boolean); begin inherited Create; FOwnedObjects := AOwnedObjects; end; destructor TAVLTree.Destroy; begin Clear; inherited; end; function TAVLTree.IsEmpty: Boolean; begin Result := not Assigned(Root); end; function TAVLTree.FindData(AKey: Cardinal): Pointer; var Node: TAVLTreeNode; begin Node := FindNode(AKey); if Assigned(Node) then Result := Node.Data else Result := nil; end; function TAVLTree.FindNode(AKey: Cardinal): TAVLTreeNode; begin Result := Root; while Assigned(Result) and (Result.Key <> AKey) do Result := Result.GetNext(AKey); end; function TAVLTree.FindOrInsert(AKey: Cardinal; AData: TObject): TAVLTreeNode; var ParentNode, NewNode: TAVLTreeNode; begin Result := Root; if Assigned(Result) then begin ParentNode := nil; Result := Root; while Assigned(Result) and (Result.Key <> Akey) do begin ParentNode := Result; Result := Result.GetNext(AKey); end; if Assigned(Result) then Exit; NewNode := TAVLTreeNode.Create(Self, AKey, AData, ParentNode); if ParentNode.Key > NewNode.Key then ParentNode.Left := NewNode else ParentNode.Right := NewNode; Balance(ParentNode); end else begin Root := TAVLTreeNode.Create(Self, AKey, AData, nil); end; end; function TAVLTree.Delete(AKey: Cardinal): Boolean; var CurrentNode, NodeA, NodeB: TAVLTreeNode; begin CurrentNode := FindNode(AKey); Result := Assigned(CurrentNode); if Result then begin if CurrentNode.LeftBalance > CurrentNode.RightBalance then begin NodeA := CurrentNode.Left; while Assigned(NodeA.Right) do NodeA := NodeA.Right; NodeB := NodeA.Parent; if NodeB = CurrentNode then begin CurrentNode.Left := NodeA.Left; if Assigned(CurrentNode.Left) then CurrentNode.Left.Parent := CurrentNode; end else begin NodeB.Right := NodeA.Left; if Assigned(NodeB.Right) then NodeB.Right.Parent := NodeB; end; CurrentNode.Key := NodeA.Key; CurrentNode.Data := NodeA.Data; FreeAndNil(NodeA); Balance(NodeB); end else if CurrentNode.RightBalance > 0 then begin NodeA := CurrentNode.Right; while Assigned(NodeA.Left) do NodeA := NodeA.Left; NodeB := NodeA.Parent; if NodeB = CurrentNode then begin CurrentNode.Right := NodeA.Right; if Assigned(CurrentNode.Right) then CurrentNode.Right.Parent := CurrentNode; end else begin NodeB.Left:=NodeA.Right; if Assigned(NodeB.Left) then NodeB.Left.Parent := NodeB; end; CurrentNode.Key := NodeA.Key; CurrentNode.Data := NodeA.Data; FreeAndNil(NodeA); Balance(NodeB); end else begin if not Assigned(CurrentNode.Parent) then Root := nil else if (CurrentNode.Parent.Left = CurrentNode) then CurrentNode.Parent.Left := nil else CurrentNode.Parent.Right := nil ; {Parent of Current Node is Not Balanced,so} Balance(CurrentNode.Parent); FreeAndNil(CurrentNode); end; end; end; procedure TAVLTree.Clear; procedure _Clear_R(ANode: TAVLTreeNode); begin if not Assigned(ANode) then Exit; if Assigned(ANode.Left) then begin _Clear_R(ANode.Left); end; if Assigned(ANode.Right) then begin _Clear_R(ANode.Right); end; FreeAndNil(ANode); end; begin _Clear_R(FRoot); end; end. Пользуйтесь :)
RENaissance
Member
Откуда: Муром->Москва
Сообщений: 10895

RinOS, уже 2,5 года прошло! Вы где были?!

З.Ы За такие портянки банить надо. Есть же тег spoiler.

Posted via ActualForum NNTP Server 1.4

S.G.
Member
Откуда: cartoon network
Сообщений: 27320
RENaissance

RinOS, уже 2,5 года прошло! Вы где были?!
Вероятно, писАл код :)
RENaissance
Member
Откуда: Муром->Москва
Сообщений: 10895

S.G.

Вероятно, писАл код :)

Долго что-то он писАл.

Posted via ActualForum NNTP Server 1.4

RinOS
Member
Откуда:
Сообщений: 58
автор
RinOS, уже 2,5 года прошло! Вы где были?!

Вот именно 2,5 года прошло, а ответа человеку так и не дали!
А 2,5 года не так уж и много, для сравнения тем же бинарным деревьям уже лет 20. (кнут так говорит :) )

Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl→      все
Виртуальные форумы   Темы из всех форумов за 3 дня   Мои избранные форумы Использование СУБД   Microsoft SQL Server   Firebird, InterBase   Oracle   Microsoft Access   IBM DB2, WebSphere, IMS, U2, etc   MySQL   PostgreSQL   OLAP и DWH   Sybase ASA, ASE, IQ   Informix   Другие СУБД   FoxPro, Visual FoxPro   Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M   SQLite   NoSQL, Big Data Дискуcсии   Сравнение СУБД   Проектирование БД   Работа   ERP и учетные системы   Разработка информационных систем   Тестирование и QA   Отчетные системы   Просто треп   Наши за рубежом   Сертификация и обучение   Hardware   Управление процессом разработки ИС   Юридические вопросы в ИТ Microsoft.NET   WinForms,.Net Framework   ASP.NET   ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM   WPF, Silverlight   WCF, Web Services, Remoting Программирование   Delphi   C++   Visual Basic   Программирование   Java   Разработка под мобильные платформы   PowerBuilder   Microsoft Office   SharePoint   XML, XSL, XPath, XQuery Web Технологии   PHP, Perl, Python   HTML, JavaScript, VBScript, CSS Администрирование ОС   Windows   Unix-системы   Другие: Mac OS, PalmOS, BeOS, PocketPC SQL.RU   Обсуждение нашего сайта   Вопрос-Ответ   Test



Рекомендуем посмотреть ещё:


Закрыть ... [X]

Построение дерева из БД, компонент-дерево - Форум на Исходниках. Ру Кольцо подари мне свое сердце

Как сделать дерево в delphi Как сделать дерево в delphi Как сделать дерево в delphi Как сделать дерево в delphi Как сделать дерево в delphi Как сделать дерево в delphi Как сделать дерево в delphi