二元树containsValue方法在返回后循环无穷

时间:2017-05-25 12:28:16

标签: java binary-search-tree equals

我有一个二叉树和一个有效的addValue()方法。我想检查树是否包含以root开头的整数值。 现在我尝试了多个代码片段,从while循环到递归。输出对我来说真的很奇怪。

public Boolean containsValue(Integer value) throws IllegalArgumentException {
    if (value == null) {
        throw new IllegalArgumentException("Value ist NULL :(");
    }
    return root != null && contains(root, value);

}
private boolean contains(Node node, Integer value) {
    System.out.println(node.getValue());

    Node tempNode = root;
    while (true) {
        if (value.equals(tempNode.getValue())){
            return true;
        }

        if (value.compareTo(tempNode.getValue()) < 0) {
            if (tempNode.getLeft() == null) {
                return false;
            } else
                tempNode = tempNode.getLeft();
        } else {
            if (tempNode.getRight() == null) {
                return false;
            } else
                tempNode = tempNode.getRight();
        }
    }
}

My Testclass创建一个Tree:

private void testContainsSimple(Tree tree) {
    tree.clear();

    tree.addValue(1);
    tree.addValue(7);
    tree.addValue(6);
    tree.addValue(26);
    tree.addValue(11);
    tree.addValue(2);
    tree.addValue(20);
    tree.addValue(12);
    tree.addValue(3);

    Assert.assertEquals(true, tree.containsValue(20));
    Assert.assertEquals(true, tree.containsValue(3));
    Assert.assertEquals(false, tree.containsValue(4));
    Assert.assertEquals(false, tree.containsValue(22));
}

测试无休止地运行并产生如下输出:

1 7 6 2 3 26 11 20 1 7 6 2 3 1 7 6 2 3 26 11 20 12 1 7 6 2 3 26 11 20 12 -342450606 -342450606 -1945094521 -1947498669 -1955603908 -2006690011 -2104529452 -2112214429 -2142578581 -2145673805 -2146602265 -2147111222 -2147367018 ....

为什么会这样?我使用了非递归方法,但它对我做了同样的事情。

public boolean addValue(Integer value) throws IllegalArgumentException {
    // Hinweis: Löschen Sie die folgende Code-Zeile und implementieren Sie
    // die AVL-Einfüge-Operation. Sie können auf die Variable root von
    // AbstractSortedTreeImpl zugreifen, um die Knoten des Baumes
    // entsprechend anzupassen. Die Methode addValue der
    // AbstractSortedTreeImpl kann Ihnen helfen, den Umgang mit der Variable
    // root besser zu verstehen.
    if (value == null) {
        throw new IllegalArgumentException("Value ist NULL");
    }

    if (root == null) {
        root = new Node(value);
        return true;
    }

    Node actNode = root;

    boolean posFound = false;
    while (!posFound) {
        if (value.equals(actNode.getValue()))
            return false;

        if (value.compareTo(actNode.getValue()) < 0) {
            if (actNode.getLeft() == null) {
                posFound = true;
                actNode.setLeft(new Node(value));
                //checkAVL(actNode);
            } else
                actNode = actNode.getLeft();
        } else {
            if (actNode.getRight() == null) {
                posFound = true;
                actNode.setRight(new Node(value));
                //checkAVL(actNode);
            } else
                actNode = actNode.getRight();
        }
    }
    return true;
}

1 个答案:

答案 0 :(得分:0)

在你包含逻辑似乎是错误的你也应该在结束逻辑中进行空检查。对于二进制搜索,如果值较小则必须指向左侧,如果值较大则必须指向右侧

// Base Cases: root is null or key is present at root
    if (root==null || root.key==key)
        return root;

    // val is greater than root's key
    if (root.key > key)
        return search(root.left, key);

    // val is less than root's key
    return search(root.right, key);

从我自己的实现中迭代

public boolean search(V value) {
        TreeNode<V> localRoot = root;
        TreeNode<V> node = search(localRoot, value);
        if (node != null) {
            return true;
        }
        return false;
    }

    private TreeNode<V> search(TreeNode<V> root, V value) {
        int cmp;
        while (root != null) {
            cmp = getCompareValue(value, root.getValue());
            if (cmp == 0) {
                return root;
            } else if (cmp < 0) {
                root = root.getLeftChield();
            } else {
                root = root.getRightChield();
            }
        }

        return null;

    }