【问题标题】:Tree (directed acyclic graph) implementation树(有向无环图)实现
【发布时间】:2008-09-27 22:37:14
【问题描述】:

我需要一个像这样的树/有向无环图实现:

public class TreeNode<K, V> {
    private K key; // 'key' for this node, always present
    private V value; // 'value' for this node, doesn't have to be set

    private TreeNode<K, V> parent;
    private Set<TreeNode<K, V>> children; 
}
  • 没有任何类型的排序。
  • TreeNode 只是键和可能值的包装(节点不必设置值)。
  • 我需要指向父母和孩子的链接。

标准 API 或 Commons 等中有什么可以为我做这件事的吗?

我不介意自己写(当然我要求你们这样做)我只是不想重新发明轮子。

【问题讨论】:

  • 注意,树和有向无环图不是一回事,对于有向无环图,这是父节点的签名:private Set&lt;TreeNode&lt;K, V&gt;&gt;,因为一个节点可以有多个父节点。

标签: java data-structures tree graph-theory


【解决方案1】:

似乎没有类似的东西。上周我问了a similar question 并最终实现了我自己的树。我的实现与您的提议非常相似:

public class TreeNode<T>
{
    private LinkedList<TreeNode<T>> children = new LinkedList<TreeNode<T>>();
    public T value { get; set; }

    public TreeNode(T value)
    {
        this.value = value;
    }
    public LinkedList<TreeNode<T>> GetChildren()
    {
        return children;
    }
}

您必须添加一个返回父级的链接。

【讨论】:

    【解决方案2】:

    还有http://www.jgrapht.org,它的软件获得了 LGPL 许可。不过,我必须警告你,实施你自己的做法充满了危险。如果您计划在结构(即图)上使用递归,则必须确保它是非循环的,否则您将遇到无限循环问题。最好在他们已经处理过问题的地方使用第三方代码。

    【讨论】:

      【解决方案3】:

      我会说最好推出自己的实现(此外,您已经很好地考虑了界面)。无论如何,您打算在这棵树上执行什么操作?您可能希望围绕您想要的东西设计您的 API……通过键/值直接访问各个节点?遍历类型?添加/删除操作?

      【讨论】:

        【解决方案4】:

        如果您正在寻找额外的图形功能,JDigraphDigraph 类应该适合您。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-24
          • 2011-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多