任何可用于查找2个术语之间距离的Java Tree API

时间:2010-08-05 07:33:26

标签: java algorithm api

我的要求是

1)我应该构建一个树,如下图所示。

2)然后我需要计算两个术语之间的距离比如C和D.或D和F.(根据图A和B是类别C,D,E和F是各类别下的条款。

预期结果:

搜索字词 ---------- 距离

C和D ---------------------- 2

C和F ---------------------- 4

D和E ---------------------- 4


图片链接:

https://t3.gstatic.com/images?q=tbn:N-Lb_jjMYri3aM:http://skrud.net/files/binary_tree_boat_race.png&t=1

alt text

是否有合适的 Java API 可以为我执行此功能,或者我应该自己编写算法。

如果根本没有合适的API,我可以在哪里寻找算法来实现这个....

非常感谢您的及时帮助

提前致谢,

1 个答案:

答案 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)。