这种方法有什么问题?似乎但我不确定树中相邻孩子的比较是不会发生的。
我粗略地追踪了这个算法的工作原理并且我认为这个想法是正确的可能是实现有问题或者我不知道递归如何工作,第二个帮助(比较)方法似乎是问题
public static int MAX(BST B) {
int m = ((Integer) B.root.data).intValue();
return call(B.root, m);
}
public static int call(node current, int max) {
//first helper method gets the max from two different levels in the tree
if(current == null)
return -1;
if(current.left == null && current.right == null)
return max;
else {
if(((Integer) current.data).intValue()>max)
max = ((Integer) current.data).intValue();
return compare(call(current.left,max),call(current.right,max));
}
}
//second helper method gets the max
static int compare(int m1, int m2) {
if(m1>m2)
return m1;
else
return m2;
}
答案 0 :(得分:3)
由于您正在搜索整个树,我将假设结构没有正确排序。
该错误发生在您的通话功能中:
if(current.left==null&¤t.right==null) return max;
想象一下,你的树有一个带有两个叶节点的根(总共三个节点)。根有值3,右有值2,左有值5.算法应返回5,但你的代码将返回3.这是因为你忽略了任何叶子(没有“子”的节点)的值那行代码。因此,在此示例中,您的代码会忽略值5,并返回max,即3。
你可以通过在left和right为null时返回compare(current.value,max)来解决这个问题。
答案 1 :(得分:0)
我认为(不是100%)您可能会遇到问题,因为您只检查BOTH子项是否为null,例如,如果right为null而且左侧不是,您将尝试在右侧调用方法call
和。也许添加一个案例检查一个子节点是否为空,如果是,则返回非空子节点的call
。
答案 2 :(得分:0)
......我不知道递归是如何运作的......
递归意味着您使用其他参数从内部调用您所使用的方法,并且有一些检查通过返回值退出或继续自我调用递归。
call()
是间接递归的,因为它退出时返回-1
或max
或者它再次使用新参数调用自身并继续执行此操作直到它退出或崩溃堆栈填满时出现OutOfMemory
错误。
这种方法不是递归的:虽然命名不佳。
static int compare(int m1, int m2) {
if(m1>m2)
return m1;
else
return m2;
}
可以写成(并重命名)为
static int min(final int m1, final int m2)
{
return Math.min(m1,m2);
}
或只是inlined
进入
return Math.min(call(current.left,max),call(current.right,max));
无论哪种方式,你得到两个值的minimum
,而不是真正比较它们意味着不同的逻辑和不同的返回值。
无论哪种方法都不是递归的,如果m1 > m2
的逻辑是合适的,那么它就不是问题,更像是对该函数的输入不是你所期望的。
步骤调试是一个功能强大的工具,所有经验丰富的开发人员每天都会使用它!