递归调用方法

Calling a method Recursively

boolean checkBST(Node root) {
  return check(root, 10001, 0);
}

boolean check(Node root, int value1, int value2) {
  if (root != null) {
    if (root.data >= value1 || root.data <= value2) {
      return false;
    } else {
      return check(root.left, root.data, value1) & check(root.right, value2, root.data); //line 13
    }
  } else {
    return true;
  }
}

请解释 value1 和 value2 在不同的调用中是如何变化的,给定的 二叉树是

     3
     / \
    5   4
   / \
  1   4

在行 check(root.left,root.data,0) & check(root.right,10001,root.data) 中,您使用与预期的 0 和 10001 不同的参数递归调用 check。忽略 Node 参数,第一次调用使用 root.data0,第二个使用 10001root.data。让我们考虑一下 check(root.left,root.data,0)。您期望 value2 总是等于 0,但事实并非如此。你可以看到在同一行中,你也将 check 称为 check(root.right,10001,root.data)。如您所见,root.data 作为 value2 的参数传递,这意味着如果它不是 0,您已经在调用中更改了 value2 的值.这意味着下一个 check(root.left,root.data,0) 调用可能对 value2 有不同的值,因此行 check(root.left,root.data,0)check(root.left,root.data,value2) 不相等。

如果这不能解决您的问题,请将其编辑得更清楚,因为很难理解您的问题是什么。

TL;DR - 当您使用 check(root.right,10001,root.data) 时,您正在更改 value2,因此它不再是 0。同样适用于 value1.