>我使用 inso 来显示存储在二叉搜索树中的搜索名称的结果,但当我运行它的示例时,我有:员工姓名"abc"和"ab",我输入名称 ="abc"它显示了其中的 2 个。任何人都可以帮助我什么是我的错:(泰
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); } }
遍历等价于迭代TreeMap
的entrySet
。
final Map<String, Employee> employees = new TreeMap<String, Employee>();
...
for (final Map.Entry<String, Employee> entry : employees.entrySet()) {
/* iterating in-order */
}
TreeMap
只是使用二叉搜索树(特别是,根据规范,红黑树)。考虑使用它而不是推出自己的解决方案;-)
话虽如此,如果你打算自己动手,也许可以尝试这样的事情......
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;
}
我认为这是你能做的。但请确保您的树没有重复的名称。
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() 方法将输入 Name 与节点进行比较,并根据名称是按字母顺序排列的较晚还是较早向右或向左移动。
大部分代码应该在 inorder() 方法中。毫无疑问,它实际上是,所以你有两个打印,所以你得到两个输出。所有 searchFull() 方法应该做的是调用 inorder(root)。