首先,这个问题不是作业。我目前正在阅读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类
中DataItem,Node,Tree234以及程序运行的位置Tree234App
答案 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