我的二进制搜索树面临问题。添加所有String值后,我可以搜索之前搜索过的内容。但是,它无法检索存储在tree.right(或tree.left)中的值。即使我的tree.right有值,但是当我搜索它时,它将返回“找不到记录”。输出和代码如下所示:
public void add(String value) {
if(value.toLowerCase().equals("red") || value.toLowerCase().equals("green") || value.toLowerCase().equals("blue") ||
value.toLowerCase().equals("yellow") || value.toLowerCase().equals("black")) {
if (root == null) {
root = new StringTreeNode(value.toLowerCase());
size ++;
}
else
addleaf(root, value.toLowerCase());
}
}
public void addleaf(StringTreeNode branch, String value) {
if(value.compareTo(branch.data) < 0) {
if (branch.left == null) {
branch.left = new StringTreeNode(value);
size ++;
} else
addleaf(branch.left, value);
} else if (value.compareTo(branch.data) > 0) {
if (branch.right == null) {
branch.right = new StringTreeNode(value);
size ++;
} else
addleaf(branch.right, value);
} else {
}
}
public void searchNode (String value) {
found = false;
if(root == null)
System.out.println("Nothing here");
else
searchBranch(root, value.toLowerCase());
if (!found)
System.out.println("Records not found.");
}
public void searchBranch (StringTreeNode tmp, String value) {
if(value.equals(tmp.data)) {
System.out.println("Records found, " + value + " exist in search history!");
found = true;
} else if (tmp.left != null)
searchBranch(tmp.left, value);
else if (tmp.right != null)
searchBranch(tmp.right, value);
}
输出
您要搜索什么?(0退出):红色
您要搜索什么?(0退出):绿色
您要搜索什么?(0退出):蓝色
您要搜索什么?(0退出):黄色
您要搜索什么?(0退出):黑色
您要搜索什么?(0退出):0
树值:红色绿色蓝色黑色黄色
堆栈值: 1.黑色 2.黄色 3.蓝色 4.绿色 5.红色
您要搜索什么存在历史?(0退出): 红色
找到记录,搜索历史中存在红色!
您要搜索什么存在历史?(0退出): 绿色
找到记录,搜索历史中存在绿色!
您要搜索什么存在历史?(0退出): 蓝色
找到记录,搜索历史中存在蓝色!
**您要搜索的存在历史记录是什么(0退出):黄色
未找到记录。**
您要搜索什么存在历史?(0退出): 黑色
找到记录,搜索历史中存在黑色!
我很好奇,尽管“ yellow”已添加到树中,但“ yellow”不在我的搜索结果中。
答案 0 :(得分:0)
您的searchBranch
方法使用错误的标准来确定要搜索的子分支。应该将tmp.data
与value
进行比较,以决定左右分支之间的关系,而不仅仅是向下碰巧碰到某个分支所导致的分支:
public void searchBranch (StringTreeNode tmp, String value) {
if(value.equals(tmp.data)) {
System.out.println("Records found, " + value + " exist in search history!");
found = true;
} else if (value.compareTo(tmp.data) < 0)
searchBranch(tmp.left, value);
else
searchBranch(tmp.right, value);
}
请注意,在确定给定的addLeaf
是属于节点的左分支还是右分支时,这与value
所使用的逻辑基本相同。