我有做过这样的。表结构三个字段
结点Id        父结点Id            结构的名称
Id            ParentId            Name
其中Id和ParentId都是整型字段,Id不要设为自动增长
{ 装入目录 }
procedure TMainForm.LoadFolder;
  function GetParentNode(Id: integer): TTreeNode;
  var
    i, iCount:integer;
  begin
    result := nil;
    with TreeView do
    begin
      iCount := Items.Count - 1;
      for i := iCount downto 0 do
        if integer(Items[i].Data) = Id then
        begin
          result := Items[i];
          break;
        end;
    end;
  end;var
  i, iCount: integer;
  iFolderId, iParentId: integer;
  sFolderName: string;
begin
  with Table1, TreeView do
  begin
    iCount := RecordCount;
    Items.BeginUpdate;
    Items.Clear;
    for i := 1 to iCount do
    begin
      RecNo := i;
      iFolderId := FieldByName('Id').AsInteger;
      iParentId := FieldByName('ParentId').AsInteger;
      sFolderName := FieldByName('Name').AsString;
      Items.AddChild(GetParentNode(iParentId), sFolderName);
      Items[i - 1].Data := Pointer(iFolderId);
    end;
    Items.EndUpdate;
  end;
end; { 重新保存TreeView中的索引 }
procedure TMainForm.ReSaveFolderIndex;
var
  i, iCount: integer;
begin
  with Table1, TreeView do
  begin
    iCount := RecordCount;
    for i := 0 to iCount - 1 do
    begin
      RecNo := i + 1;
      Edit;
      FieldByName('Id').AsInteger := integer(Items[i].Data);
      FieldByName('Name').AsString := Items[i].Text;
      if Items[i].Parent = nil then
        FieldByName('ParentId').AsInteger := 0
      else
        FieldByName('ParentId').AsInteger := integer(Items[i].Parent.Data);
      Post;
    end;
  end;
end;//当生成新结点时,该结点的id为最大值加1