网上介绍了好多这样的文章,但都不太齐全(没有添加、删除每每层的节点)。今天写了一天关于这方面的东西,还没搞定,代码,烂遭遭的,我不想贴了,各位高人,来写写怎么样?用树型结构表示科目代码的一种高效算法  
     在很多常见的财务软件中,科目代码一般都用树型结构来显示。要实现这一点,通常的做法是用多个(嵌套)循环,甚至递归等算法,将科目表中的代码”织”成树,但这样不但算法复杂,而且执行效率低。本人在实际的开发应用中,摸索出一种简单高效的算法,在此和盆托出,只在抛砖引玉,找出最佳解决方案。下面介绍在Delphi中的实现方法。
一.表结构
     首先建立如下结构的数据表TREE.DB,并输入一些测试数据:
字段名  类型    长度    说明
aCode   字符型  20      科目代码
aName   字符型  30      科目代码名称
......  ......  ......  ......
表(一)
     其中,科目代码aCode的数据类型一定要字符型(一定),长度按具体要求而定,假如要支持六级编码,且代码结构是”3-2-2-2-2-2”,则该字段的长度不小于18,而其他字段则不作要求 。另外,要为字段aCode建一索引(切记),因为要用它来排序。
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, DB, DBTables, ImgList, StdCtrls, ADODB, Menus;type
  TForm1 = class(TForm)
    treeview1: TTreeView;
    ADOConnection1: TADOConnection;
    adotable1: TADOTable;
    ImageList1: TImageList;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Edit3: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure treeview1GetImageIndex(Sender: TObject; Node: TTreeNode);
    procedure treeview1GetSelectedIndex(Sender: TObject; Node: TTreeNode);
    private
    { Private declarations }
  function getlevel(sformat,scode:string):integer;
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  tv:ttreenode;
  
const
  scodeformat = '322222';
  sfirstnodetxt  = '科目代码';implementation{$R *.dfm}function tform1.getlevel(sformat,scode:string):integer;
var
  i,level,ilen:integer;
begin
  level:=-1;
  ilen:=0;
  if (sformat<>'')and(scode<>'')then
  for i:=1 to length(sformat) do
  begin
    ilen:=ilen+strtoint(sformat[i]);
    if length(scode)=ilen then
    begin
      level:=i;
      break;
    end;
  end;
    result:=level;
end;procedure TForm1.FormCreate(Sender: TObject);
var
  nowid,showtxt:string;
  level:integer;
  mynode:array[0..6]of ttreenode;
begin
  level:=0;
  with adotable1 do
  begin
    try
    if not active then open;
    first;
    treeview1.items.clear;
    mynode[level]:=treeview1.items.add(treeview1.topitem,sfirstnodetxt);
    mynode[level].selectedindex:=0;
    while not eof do
    begin
      nowid:=trim(fieldbyname('acode').asstring);
      showtxt:=nowid+'-'+fieldbyname('aname').asstring;
      level:=getlevel(scodeformat,nowid);
      if level> 0 then
      begin
        mynode[level]:=treeview1.items.addchild(mynode[level-1],showtxt);
        end;
        next;
      end;
        finally
      close;
    end;
  end;
  mynode[0].expand(false);
end;procedure TForm1.treeview1GetImageIndex(Sender: TObject; Node: TTreeNode);
begin
node.imageindex:=node.level;
end;procedure TForm1.treeview1GetSelectedIndex(Sender: TObject;
  Node: TTreeNode);
begin
node.selectedindex:=node.imageindex;
end;end.