java - 二叉搜索树搜索疑难解答
问题描述
我花了大约两天的时间来解决这个问题,但我不知道缺少什么。最初我的BST使用可比较对象,然后我将其切换为 int 以在它不起作用时对其进行简化。
我将几个项目添加到树中,它成功地按顺序打印出来。然后,当我第一次调用search()方法时,它会返回 true,因为它应该如此。此后的所有其他搜索调用都返回 false,无论它是真还是假。
我在这里包含了我的大部分代码,以防问题与搜索方法本身无关。
输出应该是:4 12 23 27 30 42 60 84 true true false true true
但相反,我得到:4 12 23 27 30 42 60 84 true false false false false
public class BSTree {
TreeNode root;
static int comparison;
public void insert(int value) {
if (root == null) {
root = new TreeNode(value);
}
else {
root.insert(value);
}
}
public boolean search(int chicken) {
if (root != null ) {
return root.search(chicken);
}
return false;
}
public static int height(TreeNode b) {
return TreeNode.height(b);
}
public static void CompareSet() {
comparison++;
}
public int getCompare() {
return comparison;
}
public void ResetCompare() {
comparison = 0;
}
public static void traverseInOrder (TreeNode node) {
if (node != null) {
traverseInOrder(node.left);
System.out.print(" " + node.data);
traverseInOrder (node.right);
}
}
public static void main(String args[]) {
BSTree tree = new BSTree();
tree.insert(30);
tree.insert(42);
tree.insert(84);
tree.insert(12);
tree.insert(4);
tree.insert(23);
tree.insert(27);
tree.insert(60);
traverseInOrder(tree.root);
System.out.println("\n" + tree.search(30));
System.out.println("\n" + tree.search(4));
System.out.println("" + tree.search(50));
System.out.println("" + tree.search(27));
System.out.println("" + tree.search(42));
System.out.println(height(tree.root));
}
}
这是treeNode类:
public class TreeNode<T> {
int data;
TreeNode left;
TreeNode right;
TreeNode(int value){
this.data = value;
//right = null;
//left = null;
}
public void insert(int value) {
if (value == data) {
return;
}
if (value < data) {
if (left == null) {
left = new TreeNode(value);
}
else {
left.insert(value);
}
}
else {
if (right == null) {
right = new TreeNode(value);
}
else {
right.insert(value);
}
}
public boolean search(int value) {
BSTree.CompareSet();
if (data == value) return true;
if (data < value && left!=null)
return left.search(value);
else if(data > value && right != null)
return right.search(value);
return false;
}
public static int height(TreeNode b) {
if (b == null) return -1;
return 1 + Math.max(height(b.left), height(b.right));
}
public int getData(){
return data;
}
public TreeNode getLeftChild() {
return left;
}
public void setLeftChild(TreeNode leftChild) {
this.left = leftChild;
}
public TreeNode getRightChild() {
return right;
}
public void setRightChild(TreeNode rightChild) {
this.right = rightChild;
}
}
解决方案
您的比较是相反的:))) 这是更正后的 TreeNode::search 方法:
public boolean search(int value) {
BSTree.CompareSet();
if (data == value) return true;
if (data > value && left!=null)
return left.search(value);
else if(data < value && right != null)
return right.search(value);
return false;
}
我认为您交换了data
和value
变量。
推荐阅读
- android - 清除以前在 Android 上使用 RecyclerView 的画布
- c# - 如何使标签在 C# windows 窗体中每隔一段时间更改其文本
- android - 在自定义视图上重叠圆形 ImageVIew
- sql - DBArrayList 到列表
- git - 如何从工作 Github 帐户切换到个人帐户?
- azure - Azure Logic App 输出结构转换为 json 格式
- c - 使用 C 控制 Raspberry Pi GPIO 与 74HC595
- node.js - TypeError: next 不是函数时 io.use(passport.authenticate('google'))
- rust - 是否可以延长本地借用内存块的生命周期以匹配声明的生命周期?
- java - 在 RollingFile 附加程序中无法识别 log4j2 CronTriggeringPolicy