代码之家  ›  专栏  ›  技术社区  ›  CaptainHastings

记录到树

  •  1
  • CaptainHastings  · 技术社区  · 16 年前

    请给我一点建议。

    我正在尝试用以下数据行创建树:

    TOP     Level1     NotLeaf
    Level1     Data1      leaf
    TOP        Level11    NotLeaf
    Level11    Level2     NotLeaf
    Level11    Data4      leaf
    Level2     Data2      leaf
    Level2     Data3      leaf
    

    最后一列显示节点是否为叶。因此,这棵树看起来像:

    Top
    |
    |- Level1,   Level11
         |          |
         |          |
       Data1     Level2, Data4
                    |
                    |
                  Data2, Data3
    

    我将每一行数据存储在bean中,然后将bean放到一个列表中。

    public class Data {
    
        private String parent;
        private String name;
        private int isLeaf;
    
        public Data(String parent, String name, int isLeaf){
        this.parent = parent;
        this.name = name;
        this.isLeaf= isLeaf;
    
                //add to the list
        }
    
       //Getters
    
       public List<Data> getDataList(){
          return dataList;
      }
    }
    

    现在,对于树,我编写了一个节点类,如下所示:

    public class Node {
    
        private final String nodeName;
        private final List<Node> children;
    
        public Node(String nodeName) {
            this.nodeName = nodeName;
            this.children = new ArrayList<Node>(10);
        }
    
        public String getNodeName() {
            return nodeName;
        }
    
        public List<Node> getChildren() {
            return Collections.unmodifiableList(children);
        }
    
        public void addChild(Node child) {
            children.add(child);
        }
    }
    

    但是,我似乎不知道如何将数据插入节点并获得上面树中所示的关系。

    也许睡眠不足掩盖了显而易见的事实,但任何建议都是最有用的。

    谢谢

    2 回复  |  直到 13 年前
        1
  •  2
  •   AncientSwordRage    13 年前

    我自己睡眠不足,所以我不想编码,但粗略地说-

    • 您不需要列来说明某个对象是否是叶节点。如果它没有孩子,它是一片叶子,否则它不是。

    • 创建一个标记为“根”的开始节点。

    • 你的节点类很好。创建一个 HashMap<String,Node> .正如您所写,每一行都包含一个父子关系。你迭代你的行,在每一行,你做这个

    • 如果映射已经包含名为parent的节点,请获取它。否则创建它并添加到地图。孩子也一样。将子节点添加到父节点。创建节点时,如果该节点列在父列中,则将其添加到根节点。如果它列在子列中,则从根节点中删除它。

    解析完所有行后,根的唯一子级将是父列中出现的节点,而不是子列中出现的节点。任何出现在子列而不是父列中的内容都将是叶节点。父列中出现的任何内容都不会是叶,除非子列表为空。

    另外,我会避免使用标签“top”和“level1”,这意味着树中的固定位置,而我们使用标签“parent”和“child”。这样,您就可以在树中的任意一个仲裁点上存在一个关系列表。

        2
  •  0
  •   akf    16 年前

    我无法将数据与节点分离。相反,让节点是一个复合的并维护父信息。测试 isLeaf 如果 children 是空的。“top”节点的父级为空。