记录到树

时间:2009-09-29 03:12:08

标签: java data-structures tree

请一点建议。

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

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;
  }
}

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

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);
    }
}

但我似乎无法弄清楚如何将数据插入到Node中并获得如上面树中所示的关系。

也许缺乏睡眠隐藏着显而易见的,但任何建议都是最有帮助的。

由于

2 个答案:

答案 0 :(得分:2)

我自己缺乏睡眠,所以我不打算编码,但大致 -

  • 您不需要列来说明某些内容是否为叶节点。如果它没有孩子,那就是叶子,否则就不是了。

  • 创建标记为“ROOT”的起始节点。

  • 您的节点类很好。创建HashMap<String,Node>。正如你所写的那样,每一行都包含一个父母与孩子的关系。你遍历你的线,在每一行,你这样做

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

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

另外,我会避免使用标签“TOP”和“LEVEL1”来表示树中的固定位置,我们使用标签PARENT和CHILD。这样,您就可以获得可以存在于树中任何仲裁点的关系列表。

答案 1 :(得分:0)

我不会将数据与节点分开。相反,让Node成为复合并维护父信息。如果isLeaf为空,则children的测试可能会返回true。 “顶部”节点将具有空父级。