在if语句中未计算Java方法

时间:2015-11-14 18:35:23

标签: java if-statement binary-tree evaluation

我正在学习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

有人可以解释原因吗?

2 个答案:

答案 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,因此无需检查第二部分是什么。