我正在学习Java中的二叉树,由于某种原因,它不会在下面的if()评估中调用这两个方法:
if (method1() && method2())
我相信这应该评估方法1&方法2。但是,我的代码只调用method1。
以下是我的整个代码。我正在研究printPaths(Node node, String str)
方法。
public class Tree {
private static class Node {
int data;
Node left;
Node right;
Node (int newData) {
data = newData;
left = null;
right = null;
}
}
private Node root;
Tree () {
root = null;
}
public void insert (int newData) {
root = insert(root, newData);
}
private Node insert (Node node, int newData) {
if (node == null)
node = new Node (newData);
else if (newData < node.data)
node.left = insert (node.left, newData);
else // if (newData >= node.data)
node.right = insert (node.right, newData);
return node;
}
public void printPaths () {
printPaths (root, "");
}
private boolean printPaths (Node node, String str) {
if (node == null)
return true;
else {
str += String.valueOf(node.data) + " ";
if (printPaths(node.left, str) && printPaths(node.right, str))
System.out.println(str);
return false;
}
}
public static void main (String[] args) {
Tree tree = new Tree();
tree.insert(3);
tree.insert(2);
tree.insert(1);
tree.insert(4);
tree.insert(5);
tree.printPaths();
}
}
这个程序的输出只是
3 2 1
我认为应该输出
3 2 1
3 4 5
如果我用以下
替换printPaths(Node node, String str)
方法
private boolean printPaths (Node node, String str) {
if (node == null)
return true;
else {
str += String.valueOf(node.data) + " ";
boolean a, b;
a = printPaths(node.left, str);
b = printPaths(node.right, str);
if (a && b)
System.out.println(str);
return false;
}
}
输出正确;
3 2 1
3 4 5
有人可以解释原因吗?
答案 0 :(得分:3)
我相信这应该评估方法1&amp;方法2。但是,我的代码只调用method1。
不,method1() && method2()
如果method2
返回false,则不会调用method1
。如果您希望始终调用这两种方法,则可以使用&
。 &
的使用是如此罕见,你应该写一个评论来表明它是故意的。
// Use of & is intentional, not a typo.
if (method1() & method2())
答案 1 :(得分:1)
&&
中的Java
运算符是"Short-Circuting" operator。使用&&
运算符时,两个条件都必须为true
,以便对true
进行总体评估。因此,Java
如果第一部分导致&&
,则不会运行false
等式的第二部分,从而节省执行时间。这是因为false && [anything]
将始终生成false
,因此无需检查第二部分是什么。