我有一个二叉树和一个有效的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;
}
答案 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;
}