我用来显示存储在二进制搜索树中的搜索名称的结果但是当我运行它的例子时我有:员工名称“abc”和“ab”以及我输入名称=“abc”它显示其中2个。任何人都可以帮助我,这是我的错:(ty
public void searchFull(String name) {
EmployeeSLLNode p = root;
n=0;
if (p != null) {
inorder(p.left);
if(p.info.getFullname().equals(name)) {
n++;
System.out.printf("%2s %-5s %-8s %-6s %-6s%n", n, p.info.getID(), p.info.getFullname(), p.info.getAge(), p.info.getGender());
}
inorder(p.right);
}
}
答案 0 :(得分:3)
final Map<String, Employee> employees = new TreeMap<String, Employee>();
...
for (final Map.Entry<String, Employee> entry : employees.entrySet()) {
/* iterating in-order */
}
TreeMap
只使用二叉搜索树(特别是根据specification,一个红黑树)。考虑使用它而不是滚动自己的解决方案; - )
话虽如此,如果您打算自己动手,也许可以尝试这样的事情......
public EmployeeSSLnode search(final EmployeeSSLnode root, final String name) {
EmployeeSSLnode left;
return root == null
? null
: (left = search(root.left, name)) == null
? root.info.getFullname().equals(name)
? root
: search(root.right, name)
: left;
}
答案 1 :(得分:0)
我认为这是你能做的。但要确保你的树没有重复的名字。
public void searchFull(EmployeeSLLnode p, String name) {
if (p == null)
return;
searchFull(p -> left, name);
if (p.info.getFullname().equals(name)) {
//This is the node do other stuff here
return;
}
searchFull(p -> right, name);
}
最好在BST中进行常规搜索,而不是通过Inorder搜索。 在BST中依次搜集实际上会破坏BST的全部目的。使用String类的compareTo()方法将输入名称与节点进行比较,并根据名称是按字母顺序排列还是更早,向右或向左移动。
答案 2 :(得分:0)
这些代码大部分都应该在inorder()方法中。毫无疑问它实际上是,所以你有两个打印,所以你得到两个输出。所有searchFull()方法都应该调用inorder(root)。