【问题标题】:k-array tree to produce adjacency matrixk-array树产生邻接矩阵
【发布时间】:2013-07-24 18:43:54
【问题描述】:

您好,我正在尝试使用 Java 实现其输出为相邻矩阵形式的 k 数组树。给出的输入参数是 k=每个节点的子节点数和 d = 树的深度(高度)。

给定这些参数,我必须生成 k 数组树的相邻矩阵(写在文件上)。你能指导我实现这个吗?

我已经查看了以下链接,但由于我是 Java 初学者,所以我无法关注。那么有人可以指导我吗?

http://vivin.net/2010/01/30/generic-n-ary-tree-in-java/

http://sujitpal.blogspot.com/2006/05/java-data-structure-generic-tree.html

【问题讨论】:

  • 我的研究工作需要这个实现,这不是我的任务。提前致谢。

标签: java tree


【解决方案1】:

我有一个k-ary tree 的实现(它与您链接到的我的 n 叉树实现非常相似)。它不完整,但应该足以让您开始。

要生成邻接矩阵,您需要一个维度为n x k 的二维数组。然后,您必须遍历树并填充邻接矩阵。行i 将对应于节点imatrix[i][0]matrix[i][k - 1] 将包含对节点ik 子节点的引用。当然,邻接矩阵中节点的顺序取决于你的遍历方法。

【讨论】:

  • 非常感谢您的回答。我是初学者,所以你能指导我从哪里开始,因为我没有看到任何“静态 void main()”。我在哪里给出 K 和 d 等输入值?
  • @Nesh 恐怕这个问题太宽泛了。您将不得不导入这个库或简单地复制您需要的类。您将从main() 实例化此类的对象。这真的取决于你的实现。
  • 非常感谢您的回复。我可以请你给我一个如何使用它的例子吗?然后我可以从那里接管它。
  • 这样的事情github.com/c05mic/GenericN-aryTree/blob/master/README.txt在这里他举了一个例子,所以我可以更好地理解它。你能做这样的事情吗?
【解决方案2】:

基于@VivinPaliath提供的代码,我添加了一个可以生成邻接矩阵的简单(脏)脚本,其中k控制孩子的数量,d树的深度。 KAryTreeNode 的类型设置为 Integer,因为它存储了节点的索引。

输出被打印到控制台。 AbstractNodeAbstractTreeKAryTreeKAryTreeNodeNode 类TreeTreeTraversalOrder 需要添加到项目中。这些类可以在 @VivinPaliath 的 Github 存储库中找到。

public class KAryTreeGenerator {

    public static Integer index = 0;

    public static void populate(KAryTreeNode<Integer> node, int height, int k) {
        if (height == 0) {
            // nothing more to do
        } else {

            for (int i = 0; i < k; i++) {
                node.addChild(new KAryTreeNode<>(k, index));
                index = index + 1;
            }

            for (int i = 0; i < k; i++) {
                populate(node.getChildAt(i), height - 1, k);
            }
        }
    }

    public static void main(String[] args) {

        int k = 3; // number of children
        int d = 3; // depth

        KAryTreeNode<Integer> root = new KAryTreeNode<>(k, index);
        index = index + 1;

        KAryTree<Integer> tree = new KAryTree<>(k, root);

        d = d - 1;
        populate(tree.root, d, k);

        int size = (int)((Math.pow((double)k, (double)(d+1) ) - 1)/(k - 1));

        int[][] adjacencyMatrix = new int[size][size];

        List<KAryTreeNode<Integer>> queue = new LinkedList<>();

        queue.add(root);

        while(!queue.isEmpty()) {

            KAryTreeNode<Integer> parent = queue.remove(0);

            List<KAryTreeNode<Integer>> children = parent.getChildren();

            for(KAryTreeNode<Integer> child: children) {
                // adjacencyMatrix[child.data][parent.data] = -1; //shows the parent in the matrix
                adjacencyMatrix[parent.data][child.data] = 1;
            }
            queue.addAll(children);
        }

        for (int i = 0; i < adjacencyMatrix.length; i++) {
            StringBuilder builder = new StringBuilder();
            builder.append(Arrays.toString(adjacencyMatrix[i]));
            builder.deleteCharAt(0);
            builder.deleteCharAt(builder.toString().length()-1);
            System.out.println(builder.toString());
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 2014-10-19
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2020-11-07
    相关资源
    最近更新 更多