我需要一个存储整数的数据结构,每个数字都连接到紧邻其下方的两个(或更多个)相邻的数字,如
1
/ \
3 2
/ \ / \
5 6 4
/ \ / \ / \
7 9 8 10
我正在尝试在java中实现它。我是数据结构的新手,我能够实现树结构,但发现很难在java中实现它。
答案 0 :(得分:1)
您可以以可变长度2-D矩阵的形式存储它。
1
3 2
5 6 4
7 9 8 10
索引(i,j)
它的左子将是索引(i+1,j)
,右子索引将是(i+1,j+1)
提供i+1
且j+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之后,使用起来非常简单。