构建树(孩子兄弟表示法)

原创 2006年05月17日 09:22:00
构建树(孩子兄弟表示法)

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, ADODB;
type
  PTNode=^TNode;
  TNode=record
  id:string;
  fID,nID:string;
  hasCreate:boolean;
  fChild:PTNode;
  nSibling:PTNode;
end;
type
  TArr=array of TNode;
type
  TTree=class(TObject)
  root,cur:PTNode;
  constructor create; overload;
  constructor create(var arr:TArr); overload;
  function FindNode(s:string;p:PTNode):boolean;
end;
type
  TForm1 = class(TForm)
    Button1: TButton;
    conn: TADOConnection;
    Query: TADOQuery;
    Memo1: TMemo;
    procedure DisPlayFChild(p:PTNode);
    procedure LoadData(var arr:Tarr);
    function  GetNode(var arr:Tarr;s:string):PTNode;
    procedure Button1Click(Sender: TObject);
  
  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.displayFChild(p:PTnode);
begin
  if p.fChild<>nil then begin memo1.Lines.Add(p.fchild.id); end;
end;


function TTree.FindNode(s:string;p:PTNode):boolean;
var
  pn:PTNode;
begin
  result:=false;
  if p.id=s then
    begin
      result:=true;
      cur:=p;
      exit;
    end;
  pn:=p.fChild;
  while ((pn<>nil)and (FindNode(s,pn)=false)) do
    begin
      pn:=pn.nSibling;
    end;
end;

function  TForm1.GetNode(var arr:Tarr;s:string):PTNode;
var
i,n:integer;
begin
  result:=nil;
  n:=Length(arr);
  for i:=0 to n-1 do
  begin
    if (arr[i].id=s)  then
    begin result:=@arr[i]; exit; end;
  end;
end;
procedure TForm1.LoadData(var arr:TArr);              //load data from database
var
i:integer;
begin
  Query.Close;
  Query.SQL.Clear;
  Query.SQL.Add('select * from table2');
  Query.Open;
  Query.First;
  i:=Query.RecordCount;
  setLength(arr,i);
  i:=0;
  while not Query.Eof  do
  begin
    arr[i].id:=Query.Fields[0].AsString;
    arr[i].fID:=Query.Fields[1].AsString;
    arr[i].nID:=Query.Fields[2].AsString;
    arr[i].hasCreate:=false;
    i:=i+1;
    Query.Next;
  end;
  Query.Close;
end;
constructor TTree.create;
begin
  root:=nil;
end;
constructor TTree.create(var arr:TArr);             //create a tree from arr
var
i,j,n:integer;
p:PTNode;
begin
  i:=0;
  n:=Length(arr);
  while i<n do
  begin
    j:=0;
    while j<n do
    begin
      if (arr[j].id='root') and (arr[j].hasCreate=false) then
        begin
          new(root);
          root:=@arr[j];
          root.fChild:=nil;
          root.nSibling:=nil;
          cur:=root;
          i:=i+1;
          arr[j].hasCreate:=true;
        end;
      if arr[j].hasCreate=true  then
        begin
          if arr[j].fid<>'none'  then
            begin
              p:=Form1.GetNode(arr,arr[j].fID);
              if p.hasCreate=false then
                begin
                  arr[j].fChild:=p;
                  p.hascreate:=true;
                  p.fchild:=nil;
                  p.nsibling:=nil;
                  i:=i+1;
                end;
            end;
          if arr[j].nid<>'none' then
            begin
              p:=Form1.GetNode(arr,arr[j].nID);
              if p.hascreate=false then
                begin
                  arr[j].nSibling:=p;
                  p.hascreate:=true;
                  p.fchild:=nil;
                  p.nsibling:=nil;
                  i:=i+1;
                end;
            end;
        end;
      j:=j+1;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
arr:TArr;
aTree:TTree;
begin
  LoadData(arr);
  aTree:=TTree.create(arr);
  memo1.Lines.Add(atree.root.fchild.fchild.nsibling.nsibling.id);          //test
  aTree.Free;
end;

end.

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

VC++ 树的孩子兄弟表示法

树的孩子兄弟表示法,又叫二叉树表示法、二叉链表表示法,它是以二叉链表作为存储结构。 这个主要是因为在工作中要将一个三级菜单处理成需要的格式。我会在汽车电子中将这个程序列出来。Tree.h struc...

poj 1192 最优连通子集 树的孩子兄弟表示法+简单树型dp

题意: poj的良心中文题,不赘述了。 分析: 难点是想到能把题中的最优单连通子集问题转化为求树的最大权子树问题,之后我用的是孩子兄弟表示,当然在建树的时候直接dp也行。树的最大权子树感觉是最简...

树的孩子兄弟表示法

/************************************************************************/ /* 树的孩子兄弟表示法 ...

普通二叉树转二叉链表(孩子兄弟表示法)

4.构造树T的孩子兄弟表示法。 求取树T的高度。 解: 孩子兄弟表示法:  1 2 3 4 5 6 public...

数据结构之通用树(孩子兄弟表示法)

孩子兄弟表示法模型,每个结点都有一个指向其第一个孩子的指针,每个结点都有一个指向其第一个右兄弟的指针 。

任意有根树的左孩子右兄弟表示法存储

算法导论:10.4-4 对一个含n个结点的任意有根树,写出一个O(n)时间的过程,输出其所有关键字。 该树以左孩子或兄弟表示法存储。
  • nrj
  • nrj
  • 2014-10-14 22:32
  • 1098

使用C++ 和 孩子兄弟表示法实现树

VS2008可以运行通过。程序参考了许多大牛的总结,因能力有限,如有问题,请各位大牛指正。 程序采用孩子兄弟表示法存储树,实现了树的构造、遍历、深度、宽度、结点个数、叶子个数 以及 结点的层次、祖先、...

层号表示法转孩子兄弟表示法(二叉树)

孩子兄弟表示法:左儿子,右兄弟 思路:建树建完一个节点,将其压入栈,以便下一个元素与他比较层号 #include #include #include #define maxn 1111 #defi...

数据结构——树的存储结构孩子表示法

下面的程序就是下面这张表的实现: 程序实现 参考了《大话数据结构》中的定义:typedef struct CTNode{//孩子结点 int child; struct CTNod...

树的存储结构之双亲孩子表示法

已知给出的树结构如下图:用代码实现方式如下:/* 孩子表示法:浪费资源 双亲孩子表示法:数组和链表的结合 */ /* 1.双亲孩子表示法定义一个数结构,运用结构体指针的编程方式 2.找到每个结构之间的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)