孩子有不同父母的树结构

时间:2015-10-30 07:25:59

标签: java algorithm data-structures tree

我需要一个存储整数的数据结构,每个数字都连接到紧邻其下方的两个(或更多个)相邻的数字,如

      1
     / \
    3   2
   / \ / \
  5   6   4
 / \ / \ / \
7   9   8  10

我正在尝试在java中实现它。我是数据结构的新手,我能够实现树结构,但发现很难在java中实现它。

3 个答案:

答案 0 :(得分:1)

您可以以可变长度2-D矩阵的形式存储它。

1
3 2
5 6 4
7 9 8 10

索引(i,j)它的左子将是索引(i+1,j),右子索引将是(i+1,j+1)提供i+1j+1在范围内,以防万一2个孩子你也可以为更多的孩子扩展这个。

答案 1 :(得分:1)

您可以按如下方式创建树结构

class Node
{
    Node mNodeLeftParent;
    Node mNodeRightParent;
    Node mNodeLeftChild;
    Node mNodeRightChild;
    int miValue;
}

class MyTree
{
    Node root;
}

答案 2 :(得分:0)

随着数据结构的发展,您的情况不是,而是(更一般)。 JDK没有Graph数据类型(也不是Tree)因此您必须查看类似JGraphT的内容。

DirectedGraph<Integer, DefaultEdge> g = 
    SimpleDirectedGraph.<Integer, DefaultEdge> builder(DefaultEdge.class)
        .addEdgeChain(1, 3, 5, 7)
        .addEdgeChain(1, 3, 5, 9)
        .addEdgeChain(1, 3, 6, 9)
        .addEdgeChain(1, 3, 6, 8)
        .addEdgeChain(1, 2, 6, 9)
        .addEdgeChain(1, 2, 6, 8)
        .addEdgeChain(1, 2, 4, 8)
        .build();

// the edge chains are just to be exhaustive in all the paths
// but only one edge is added, for each pair, like the following
g.addVertex(10);
g.addEdge(8, 10);

Stream<Integer> parents = g.incomingEdgesOf(6).stream().map(g::getEdgeSource);
Stream<Integer> children = g.outgoingEdgesOf(6).stream().map(g::getEdgeTarget);

System.out.println(" parents of 6 = " + parents.collect(Collectors.toList()));
System.out.println("children of 6 = " + children.collect(Collectors.toList()));

您也可以使用无向图,但是您需要将所有边连接到6并检查6是否是获取所需内容的源或目标。

对于您的场景,可能存在开销,因为JGraphT非常通用。它仍然非常方便,在第一次使用API​​之后,使用起来非常简单。