我有二个类如: nodes,和tree.
现在通过tree的方法,向tree 中的 hashtable 中添加 N 个Node的对象.
它们之间有孙,子,父等多重关系,现在我要如何才能够,按父->子->孙,这样的结构排序输出?
数据实例是这样的: 
Node(id,pid,name) 的构造函数.
Tree t = new Tree();
     t.AddNode(1,0,"Root");
     t.AddNode(2,1,"Parent");
     t.AddNode(3,1,"P' brother");
     t.AddNode(4,2,"child");
这些添加可能是无序添加的.现在要求结果输出如何形式
[+]-Root
   |
   +--Parent
   |  |
   |  +-- Child
   |
   +--P' Brother

解决方案 »

  1.   

    作个深度优先搜索算法就可。另外,建议按Component模式设计你的Tree。那么他的添加方法应该设计成这样:Tree.Nodes[].Nodes.Add(tn);
      

  2.   

    谢谢楼上的回复,这段时间的提问都没有人看,是不是高手都先回家过年了?呵..深度优先搜索算法 ?? 我不懂.
    我那个是用C#写的继续于system.web.ui.webcontrols.webcontrol的自定义控件.
    现在是有这样的思路,但一直没实现
    暴路一个Datasource属性,用于接受DataSet类型数据.
    然后把数据加入到hashtable处理.现在是读取的数据是无序的.
    所在在客户端用JS控件树时,会位置不正确,全部跑到下面去了.
    我想得先调整或者怎么样把hashtable排序好,再输入?
    谢...
      

  3.   

    public void addNodes(DataTable dataTable)
    {
    int rootid = getRootID(dataTable);
    addNode(0,rootid);
    addNodes(rootid,dataTable);
    } public void addNode(int pid,int nodeId)
    {
    //将对应的nodeID加到对应的位置,pid 为0表示是root
    } public int getRootID(DataTable dataTable)
    {
    int rootid = 0;
    //Other steps
    return rootid ;
    } public ArrayList getChild(int pid,DataTable dataTable)
    {
    ArrayList arrayList = new ArrayList();
    //Other steps
    return arrayList;
    } public void addNodes(int pid,DataTable dataTable)
    {
    ArrayList arrayList = getChild(pid,dataTable);
    if(arrayList != null)
    {
    foreach(object o in arrayList)
    {
    int nodeid = 2 ; //此处改为实际取得nodeid
    addNode(pid,nodeid);
    addNodes(nodeid,dataTable);
    }
    }
    }这是一个简单的实现机制,通过这样,大概可以把你的 DataTable 的数据树形化。但假如想显示正确,那就得在你的Tree的显示机制上面下功夫了。
    不知我理解是否正确,你是想写一个类似TreeView的东东?
      

  4.   

    现在没办法获得/确认哪个是当前节点的最后结点.
    我Node 的定义是这样的
    public class Node {
              long id,pid;
              string name;          public Node(long id,long pid,string name)
              {
              }          ....//NODE 类的属性和方法.
    }public class Tree
    {
             Hashtable nodes;         public void AddNode(Node aNode)
             {
                if(nodes.Length==0)
                {
                       
                      AddNode(new node(0,-1,"ROOT"));
                }
                 else
                 {
                       nodes.Add(aNode.Name, aNode);
                 }
             }          public void FindChild(Node fNode)
               {
                       // foreach items in hashtable.
               }
    }问题是,我现要要打印出这个树,结果如(http://www.amoyonline.com/TREENODE.jpg)时.
    1.前面的小图标无法控件.如根结点是用[+]图标,展开后是[-],最后结点是|_ 中间节点是|-
    2.如果不在输出前排序,那么打开有子节点的节点时,下面的子节点全部跑到最底下了,不是在父节点下面.
      

  5.   

    在数据库中加个父节点字段,标志上一节点,然后用递归foreach{}循环显示,我就是这样做的
      

  6.   

    是在Node 类中加Node parent吗?
    能不能POST你的部份代码或多给点帮助谢谢!
      

  7.   

    如果在Node类中增加parent属性,在Tree类中增加节点也不懂parent是哪个呀.
    也不能知道某个节点是最后节点呀.
    Help me...