现有组织结构,其特征为:1、树状;2、每个节点代表一个人;3、每个节点可有0--4个子节点;4、每个节点都可登录管理系统;5、每个节点登录系统后只能看到自己、自己的子节点、子节点的子节点等等往下类推想要的算法是如何通过登录节点,遍历其所有下属并返回下属的节点值。管理系统为数据库管理,暂定在此系统中所有人的系统编号(即节电值)均为阿拉伯数字,如组织的最高领导人编号为0,他的所有直属下属分别为1、2、3、4,2的所有直属下属为9、10、11、12举例说明一下,假设现在该组织共有4层,人员总数为33人,最大编号到41,现登录人为1号,已知其子节点有5、6、8,其子节点的子节点有21、22、23、24、31、35,要求遍历后显示的节点顺序为1、5、21、22、23、24、6、7、31、8、35不知道说清楚没有,能看明白的大侠们帮帮忙给点思路吧

解决方案 »

  1.   

    只要每个节点有信息:本节点id,父节点id
    就可以遍历得到每个节点的所有直接或间接子节点具体的差别只是在sql里实现还是程序里实现,效率的高低
      

  2.   

    1、算法上就是树的深度优先遍历
    2、具体代码写法要看你用什么列表控件显示,如TreeView
      

  3.   

    我觉得楼主的树视图是不是应该是堆啊?不然随便一棵树,你首先就要先描述树的具体结构,然后再用深度优先算法遍历某个节点的子树。
    如果是堆的话,那一个节点N的子节点以楼主的示例来说就是N*4+1,N*4+2,N*4+3,N*4+4,判断哪些子节点在堆中,在的加入序列,深度优先遍历
      

  4.   

    用Treeview 显示数据数据存储
    编号  姓名   父节点编号
    04   张三   01
      

  5.   

    procedure ergp(m:integer;n:integer;var temp:array of integer;var x:integer);pascal;    //m:所有会员中的最大编号;n:登录人的编号;temp:临时数组名;x:数组元素下标
    begin
         if ((n*4+1)>m) and ((n*4+2)>m) and ((n*4+3)>m) and ((n*4+4)>m) then   
          begin                       //判断是否最底层
              temp[x]:=n;
              x:=x+1;
              exit;
         end
         else
         begin
              temp[x]:=n;
              x:=x+1;
              ergp(m,n*4+1,temp,x);
              ergp(m,n*4+2,temp,x);
              ergp(m,n*4+3,temp,x);
              ergp(m,n*4+4,temp,x);
         end;
    end;我自己给搞出来了 发上来大家讨论讨论 用的深度优先遍历 构想是通过登录人的编号 把其所有下属的编号存入临时数组temp(不论该编号是否有人) 然后在另外的代码里用这个临时数组的所有元素在数据库中搜索 找到的存入正式数组 没找到就跳过 以实现最终目的