我的要求是
1)我应该构建一个树,如下图所示。
2)然后我需要计算两个术语之间的距离比如C和D.或D和F.(根据图A和B是类别C,D,E和F是各类别下的条款。
预期结果:
搜索字词 ---------- 距离
C和D ---------------------- 2
C和F ---------------------- 4
D和E ---------------------- 4
图片链接:
是否有合适的 Java API 可以为我执行此功能,或者我应该自己编写算法。
如果根本没有合适的API,我可以在哪里寻找算法来实现这个....
非常感谢您的及时帮助
提前致谢,
答案 0 :(得分:3)
由于这被标记为家庭作业,因此您可能希望自己编写。
通常,当涉及到遍历树时,您没有太多的优化机会,因为从节点开始,您只能访问父节点或子节点。 (与图表相对,您可以应用Dijkstra's algorithm)
试试吧,我会推荐递归。
节点通常如下所示:
public class Node {
public String value; //contains "C" or "D" etc
public List<Node> children = new ArrayList<Node>();
public Node parent;
public Node(Node parent){
this.parent = parent;
}
public Node(Node parent, String value){
this.parent = value;
this.value = value;
}
public boolean equals(Object n){//Nodes are equal if they have the same value
return value.equals(((Node)n).value);
}
}
如果问题是要找到从A到B的最小步数(即距离),我将实现一个distanceTo
方法,该方法遍历树并查找目标节点,直到找到它为止。如果你之前从未使用树木,那可能会有点棘手。
好的,因为您之前从未与Trees合作过:
树是包含一定量节点的数据结构。节点之间的连接由节点之间的引用表示。
每个节点都有一个对它的父节点(上面的节点)和一个子节点列表(下面的节点)的引用。一个节点只能有一个父节点,但可以有任意数量的子节点。没有任何子节点的节点称为叶子。根节点通常是可识别的,因为它的parent
属性是null
(因为根,它是最顶层的节点,没有父节点)。树中的所有其他节点都有parent!=null
。
树的起点是根节点。以下代码从您的图片中创建最顶层的3个节点(其中类型Node
是上面的java类):
Node nodeRoot = new Node(null, "root"); //create a node with parent=null
Node nodeA = new Node(nodeRoot, "A");
Node nodeB = new Node(nodeRoot, "B");
nodeRoot.children.add(nodeA); //you could also place this functionality
nodeRoot.children.add(nodeB); // in the constructor of Node
你现在有一棵树(从nodeRoot
开始)有3个节点:“root”,“A”和“B”。
您现在可以显示所有根节点的直接子节点:
for(Node child:nodeRoot.children){
System.out.println(child.value);
}
/* prints:
A
B
*/
或打印父节点的值:
System.out.println(nodeA.parent.value);
/*prints:
root
*/
尝试完成代码以创建代表图片中的树的树!
要继续( - &gt;树遍历),我强烈建议您先read something about it。专注于深度优先遍历和广度优先遍历,确保您了解其中的差异。
关于“非二元树”: 这对非二叉树非常有效。 definition of Binary Trees州:
二叉树是一种树数据结构,其中每个节点最多有两个子节点。
由于我在上面的java类中使用了一个节点列表,因此每个节点可以使用任意数量的子节点。实际上,您需要投入额外的工作来使类符合二叉树 - 这意味着确保每个节点只能有0,1或2个子节点。
对于非二进制树,您可以a)使用上面的类,b)应用相同的算法(BFS / DFS)。