找到2-3-4树的最小值

时间:2014-07-29 01:21:22

标签: java algorithm minimum 2-3-4-tree

首先,这个问题不是作业。我目前正在阅读Robert Lafore的“数据结构和算法第2版”一书。在第10章中,我们学习了2-3-4棵树,然后被要求编写一种方法来查找所述树中的最小值。

从概念的角度来看,我理解最小值的位置。它只是叶子中最左边的数据项。

从编程的角度来看,我对如何实现查找此数据项的方法感到困惑。我有一个布尔值,可以判断节点是否是叶子。所以我最初做的是:

  public long minValue() {
   Node curNode = root; // current node = root
   long min = curNode.getMin();
   while(!curNode.isLeaf()) { // while current node is NOT a leaf
       curNode = getNextChild(curNode, min);
   } // end while
   return min;
} // end minValue()

这是什么(至少我认为它应该做的是创建一个从根节点开始的curNode。然后创建一个存储curNode.getMin的最小值.getMin()只是获取索引处数组的值0(应该保持最低值)。然后,当前节点不是叶子时,我们应该从最小点遍历下一个子节点。一旦当前节点是叶子,它应该返回最小值。 / p>

但这不起作用。有没有人知道如何实现这个?提示或建议或其他任何内容?

编辑:要查看每个类及其交互方式,以下是每个单独类的链接。我把最小值方法放在我的Tree234类

DataItemNodeTree234以及程序运行的位置Tree234App

2 个答案:

答案 0 :(得分:2)

首先,为了更好地提供更好的帮助,发布一个SSCCE,它为我们提供了整个程序的最小化实现 - 我们可以将这些内容添加到我们自己的IDE中并自行运行以查看正在进行的操作。很难说出为什么"这不起作用"当我们只看到你的代码时。

其次,你需要详细说明"这不起作用"意味着 - 即告诉我们它做了什么或不做什么是出乎意料的。代替你这样做,我们怎么能以任何程度的确定性告诉你它为什么这样做。

然而,有一件事情跳出来:你将min实例化为根节点的最小(直接)子节点,然后(推测)迭代遍历树以找到其中最左边的元素,但之后您将返回最初创建的min值。换句话说,虽然您的迭代例程可能正在按照您的意愿执行,但您不会因此而对返回值执行任何操作。

我怀疑你需要做类似的事情:

  public long minValue() {
      Node curNode = root;
      long min = curNode.getMin();
      while(!curNode.isLeaf()) { // 
           curNode = getNextChild(curNode, min); //it's not immediately clear what min is doing here 
       } 
       //curNode is now the leftmost non-leaf element in the tree
       min = curNode.getMin();
       return min;

请注意,我所做的唯一更改是在return语句上方插入行,该行将min重新分配给附加到树中最左侧元素的最小值。

答案 1 :(得分:0)

为了提高效率,请注意您不需要调用getNextChild(curNode, min),因为节点中的项始终按2-3-4树中的升序排序,最小项始终位于索引{{ 1}}。启动时也没有必要声明min。所以你的程序可能是这样的:

0