【发布时间】:2016-04-26 03:24:38
【问题描述】:
我必须创建一个静态方法来检查给定的树是否是二叉搜索树。它以BinaryTree<String> 作为参数,每个节点只能接触一次。
我以前用数字填充树,但数据类型为字符串,现在我将它们切换为字母,因为有些人认为我想使用整数。
我遇到的问题是,在 tree4 上执行我的 isBST() 方法时,布尔 bst 没有被触发。
到目前为止,我所拥有的是:
public class BinarySearchTree < T extends Comparable < ? super T >> {
public static boolean isBST(BinaryTree<String> tree) {
boolean bst = true;
if (tree.getRootData() != null) {
Iterator<String> iterator = tree.getInorderIterator();
String prev = iterator.next();
while (bst && iterator.hasNext()) {
String next = iterator.next();
System.out.println(next); // Debug purposes only
if (prev.compareTo(next) > 0) {
bst = false;
}
}
}
return bst;
}
}
对于我的测试用例,我有这个:
public class Test {
public static void main(String[] args) {
BinarySearchTree<String> tree1 = new BinarySearchTree<String>();
BinarySearchTree<String> tree2 = new BinarySearchTree<String>();
BinaryTree<String> h = new BinaryTree<String>("h");
BinaryTree<String> g = new BinaryTree<String>("g");
BinaryTree<String> f = new BinaryTree<String>("f");
BinaryTree<String> e = new BinaryTree<String>("e", f, g);
BinaryTree<String> d = new BinaryTree<String>("d");
BinaryTree<String> a = new BinaryTree<String>("a");
BinaryTree<String> b = new BinaryTree<String>("b");
BinaryTree<String> tree3 = new BinaryTree<String>("c", a, e);
BinaryTree<String> tree4 = new BinaryTree<String>("c", a, b);
System.out.println("BinarySearchTree.isBST(tree3): " + BinarySearchTree.isBST(tree3));
System.out.println("BinarySearchTree.isBST(tree4): " + BinarySearchTree.isBST(tree4));
}
}
这将返回以下输出:
c
f
e
g
BinarySearchTree.isBST(tree3): true
c
b
BinarySearchTree.isBST(tree4): true
当我从我的静态方法中打印出 compareTo 语句时,我看到第二棵树 (tree4) 在遇到 b 时返回 -1。这就是为什么对于tree4,它返回true,因为布尔值没有被触发。
对此有何建议?
【问题讨论】:
-
您可以在发现失败后立即通过
return false终止迭代。无需继续。 -
事实上,只要 bst 标志设置为 false(while 循环中的条件),他就会终止循环,但是是的,然后返回,并且有更多的优化。
-
伙计们,我要编辑我的问题以显示我已经完成的一些调试
-
你还没有纠正你原来的错误,(我之前提到过),你永远不会更新“prev”,它总是设置为中序遍历中的第一个节点,所有其他节点在然后将遍历与第一个节点进行比较。一旦你完成使用 (compareTo) 设置 prev 到下一个和 iterator.next() 的检查条件
标签: java data-structures tree binary-tree inorder