Java 子级具有不同父级的树结构

Java 子级具有不同父级的树结构,java,algorithm,data-structures,tree,Java,Algorithm,Data Structures,Tree,我需要一个存储整数的数据结构,这样每个数字就可以直接连接到它下面的两个(或多个)相邻的数字,比如 1 / \ 3 2 / \ / \ 5 6 4 / \ / \ / \ 7 9 8 10 我正试图用java实现这一点。我不熟悉数据结构,能够实现树形结构,但发现在java中很难实现。您可以将其存储为可变长度的二维矩阵形式 1 3 2 5 6 4 7 9 8 10 对于索引(i,j)它的左子级将是索引(i+1,j),右子级索引将是(

我需要一个存储整数的数据结构,这样每个数字就可以直接连接到它下面的两个(或多个)相邻的数字,比如

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

我正试图用java实现这一点。我不熟悉数据结构,能够实现树形结构,但发现在java中很难实现。

您可以将其存储为可变长度的二维矩阵形式

1
3 2
5 6 4
7 9 8 10

对于索引
(i,j)
它的左子级将是索引
(i+1,j)
,右子级索引将是
(i+1,j+1)
,前提是
i+1
j+1
在2个子级的情况下在范围内。您还可以将其扩展为更多子级。

您可以创建一个树结构,如下所示

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

class MyTree
{
    Node root;
}

随着数据结构的发展,您的情况不是一棵树,而是一个图(更一般)。JDK没有
图形
数据类型(也没有
),因此您必须像这样

DirectedGraph g=
SimpleDirectedGraph。生成器(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();
//边链在所有路径中都是穷举的
//但每对只添加一条边,如下所示
g、 添加顶点(10);
g、 增编(8,10);
Stream parents=g.incomingEdgesOf(6).Stream().map(g::getEdgeSource);
streamchildren=g.outgoingEdgesOf(6).Stream().map(g::getEdgeTarget);
System.out.println(“6的父项=“+parents.collect(Collectors.toList()));
System.out.println(“6的孩子=”+children.collect(Collectors.toList());
您也可以使用无向图,但是您需要获得连接6的所有边,并检查6是源还是目标,以获得您想要的


对于您的场景,可能会有开销,因为JGraphT非常通用。尽管如此,它还是非常方便,而且在首次尝试使用API之后,使用起来非常简单。

到目前为止,您尝试了什么?你被困在哪里?请阅读Java Collections类没有默认的
实现,但是您可以像中那样轻松创建自己的实现。这不是树。除非边缘是从上到下的。即使在这种情况下,它也不是一棵树:)你能用更多的东西来阐述一下吗example@RanjeetSIngh你能给出3个子节点的预期结构吗?我也在尝试这种方法,只创建了一个节点,但在遍历根节点和创建子节点时,我遇到了困难,同时将普通子节点放在两个节点上不同的父引用。请在问题中添加函数。
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()));