递归调用方法
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.data
和 0
,第二个使用 10001
和 root.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
.
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.data
和 0
,第二个使用 10001
和 root.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
.