表中的字段有ID, name,父ID 
谁有算法或源码?

解决方案 »

  1.   

    建议楼主加个Level字段存放结点的级数,这样做广度优先遍历效率高点。
      

  2.   

    function CreateClassTree(aParent: TTreeNode;
      Level: integer; SLevel, SText,Scode: TStrings;aClassTree:TTreeNodes;aLevelWord:String): boolean;
    var
      I:integer;
      TempNode:TTreeNode;
    begin
      Result:=False;  //TempNode:=TTreeNode.Create(Nil);  For i:=0 to Slevel.Count-1 do
         begin
           //添加子结点
           //是否符合级别
           if length(Slevel.Strings[i])=(level+1)*3 then
              if level=0 then
                begin
                  TempNode:=aclassTree.Add(aparent,sText.Strings[i]+'('+Scode.Strings[i]+')');
                  CreateClassTree(tempnode,level+1,Slevel,stext,Scode,aclasstree,Slevel.Strings[i]);
                  Result:=True;
                end
              else
                begin
                  if copy(slevel.Strings[i],0,level*3)=aLevelWord then
                    begin
                      TempNode:=aclassTree.AddChild(aparent,sText.Strings[i]+'('+Scode.Strings[i]+')');
                      CreateClassTree(tempnode,level+1,Slevel,stext,sCode,aclasstree,Slevel.Strings[i]);
                      Result:=True;
                    end;
                end;
         end;
         //tempnode.Free;end;//深度优先算法建子树Function CreateBomTree(aParent:TTreeNode;aTblBomCName,aMFieldName,aCFieldName,aRootName:String;aAdoConn:tAdoconnection;aTree:TTreeNOdes):Boolean;
    var
      i:integer;
      TempNode:TTreeNode;
      TempQry:TAdoQuery;
    begin
      Result:=False;
      TempQry:=TAdoQuery.Create(nil);  Try
        //找子结点
        TempQry.Active:=False;
          TempQry.SQL.Clear;
          TempQry.SQL.Add('Select '+aCFieldName);
          TempQry.SQL.Add(' From '+aTBlBomCName);
          Tempqry.sql.Add(' where '+aMFieldName+'='''+aRootName+'''');
        TempQry.Active:=true;       //递归找子树
           if TempQry.RecordCount>0 then
              begin
                TempQry.FindFirst;
                  for i:=1 to TempQry.RecordCount do
                    begin
                      TempNode:=aTree.AddChild(aParent,TempQry.Fieldbyname(aCFieldName).AsString);
                      CreateBomTree(TempNode,atblBomcName,aMFieldName,aCFieldName,TempNode.Text,aAdoconn,aTree);
                      TempQry.Next;
                    end;
              end;
           result:=True;
      Finally
        TempQry.Free;
      end;end;