Java 树中相邻孩子的比较没有发生?

Java 树中相邻孩子的比较没有发生?,java,recursion,binary-tree,max,Java,Recursion,Binary Tree,Max,这种方法有什么问题?看起来,但我不确定树上相邻孩子的比较是否没有发生 我用手粗略地跟踪了这个算法的工作原理,我认为这个想法是正确的,可能是实现有问题,或者我不知道递归是如何工作的,第二个助手(compare)方法似乎就是问题所在 public static int MAX(BST B) { int m = ((Integer) B.root.data).intValue(); return call(B.root, m); } public static int call(node c

这种方法有什么问题?看起来,但我不确定树上相邻孩子的比较是否没有发生

我用手粗略地跟踪了这个算法的工作原理,我认为这个想法是正确的,可能是实现有问题,或者我不知道递归是如何工作的,第二个助手(compare)方法似乎就是问题所在

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;
}

我认为(不是100%)您可能有问题,因为您只检查两个子项是否都为null,例如right为null,left为null。您将尝试在right和left上调用方法
call
。也许可以添加一个案例来检查一个子元素是否为null,如果是,则返回非null子元素的
调用。

由于您正在搜索整个树,因此我将假设结构的顺序不正确

您的调用函数中存在以下错误:

 if(current.left==null&&current.right==null) return max;
假设有一棵树,它的根有两个叶节点(总共三个节点)。根的值为3,右的值为2,左的值为5。算法应该返回5,但代码将返回3。这是因为您忽略了具有该行代码的任何叶(没有“子节点”的节点)的值。因此,在本例中,您的代码忽略值5,并返回max,即3

当left和right为null时,可以通过返回compare(current.value,max)来修复此问题

。。。我不知道递归是如何工作的

递归意味着您所在的方法将从自身内部使用一些其他参数进行调用,并且有一些检查通过返回值退出,或者继续以递归方式调用自身

call()
是间接递归的,因为它要么以返回值
-1
max
退出,要么以新参数再次调用自身,并继续这样做,直到堆栈填充时退出或崩溃,并出现
OutOfMemory
错误

这个方法不是递归的:尽管它的名称不好

static int compare(int m1, int m2) {
  if(m1>m2)
    return m1;
  else 
    return m2;
}
可以写成(并重新命名为)

或者只是
内联到

return Math.min(call(current.left,max),call(current.right,max));
无论哪种方式,您都会得到两个值的
最小值
,而不是真正比较它们,这意味着不同的逻辑和不同的返回值

无论哪种方式,该方法都不是递归的,如果
m1>m2
的逻辑是适当的,则不会是问题,更像是该函数的输入不是您所期望的


Step调试是一个功能强大的工具,所有有经验的开发人员每天都使用它

当然!!谢谢你现在可以工作了,我对递归还是很陌生,但我仍然无法说服自己它可以工作,但是帮了我很大的忙。谢谢,我猜它归结到了第二个基本情况中的返回最大值部分…它实际上忽略了叶节点中的值,所以它永远不会在那里寻找最大值(因此应该调用另一个命名错误的比较),现在似乎可以工作了,但我必须检查更多的案例来确定。
return Math.min(call(current.left,max),call(current.right,max));