我的表结构是:
   p_id       p_parent       P_name
    0             0            中药
    1             1            西药
    3             0            动物类
    4             0            植物类 
    5             1            片剂
    6             1            水剂
  其中:P_id 就是节点号;P_paren就是P_id的父节点号;P_name就是节点名称.
  我要实现的功能是我在数据库的表里去出数据,然后生成树。主要就是算法的实现
  。不管我在数据库表里面怎么加节点,都能相应地把节点放到响应的父节点之下.
   如:
    中药
      -动物类
      -植物类
    西药
      -水剂
      -片剂
 如果现在我在数据库表里面增加一个节点
   p_id       p_parent       P_name
    0             0            中药
    1             1            西药
    3             0            动物类
    4             0            植物类 
    5             1            片剂
    6             1            水剂
    7             3            动物类子类
那么树就是这样显示:
   
    中药
      -动物类
         -动物类子类
      -植物类
    西药
      -水剂
      -片剂
这样的算法该怎么写??
 
     

解决方案 »

  1.   

    别写了,用现成的组件吧
    DBTreeList
    DevExpress 产品很好用的下载地址
    http://www.delphijs.net/list.asp?id=2769例子,告诉我地址,我给你发过去;当然你也可以在我的站点上下载
    http://qixin000.vicp.net/down/demos.rar
      

  2.   

    hotzhu:我就是全部显示,我写了好久写不出来。
             能帮我写出这个算法吗?
      

  3.   

    我发表了一篇文章,内容就是关于你的问题的去看一下,里面也有算法的:
    http://www.csdn.net/develop/Read_Article.asp?Id=18824
      

  4.   

    haoco: 好的!  这分就给你啦!
      

  5.   

    其实很好解决!Dict_CheckItem
       p_id       p_parent       P_name
        0             0            中药
        1             1            西药
        3             0            动物类
        4             0            植物类 
        5             1            片剂
        6             1            水剂
        7             3            动物类子类SQL:
    SELECT ShangJiMC=b.p_name As ShangJiMC,a.p_name As HeSuanMC
    FROM Dict_CheckItem a,Dict_CheckItem b
    where a.p_parent*=b.p_id 
    ORDER BY a.p_parent//添加项目树
    function TCheckItemForm.LoadItemTree: string;
    var
      vNodeText: string;
      vNode: TTreeNode;
      function FindTreeNode(aNodeText: string; aHeSuanJB: Integer): TTreeNode;
      var
        i: Integer;
      begin
        for i := 0 to tv.Items.Count - 1 do
          if (aNodeText = tv.Items.item[i].Text) and (tv.Items.item[i].Level =
            aHeSuanJB - 1) then
            Result := tv.Items.item[i];
      end;
    begin
    //  tv.visible :=false;
      //初始化
      tv.OnChange := nil;
      tv.Items.Clear;
      //初始化提取语句
      with qryItem do
      begin
        Close;
        Open;
      end;
      //根目录
      tv.Items.Add(nil, '医院核算结构图');
      with qryItem do
      begin
        //打开核算表
        Close;
        Open;
        First;
        while not Eof do
        begin
          if FieldByName('ShangJiMC').isnull then
            vNode := FindTreeNode('医院核算结构图', 1)
          else
            vNode := FindTreeNode(FieldByName('ShangJiMC').AsString,
              FieldByName('HeSuanJB').AsInteger);
          tv.Items.AddChild(vNode, FieldByName('HeSuanMC').AsString);
          Next;
        end;
      end;
      //tv.visible :=true;
      tv.OnChange := tvchange;
    end;看楼主也是做药品管理的!你很幸运,我做了两年的HIS,不过现在已经不做了!
      

  6.   

    SQL错了:
    SELECT b.p_name As ShangJiMC,a.p_name As HeSuanMC
    FROM Dict_CheckItem a,Dict_CheckItem b
    where a.p_parent*=b.p_id 
    ORDER BY a.p_parent