1

我使用以显示存储在二叉搜索树中的搜索名称的结果,但是当我运行它时,我有:员工姓名“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);
        }
    }

4

3 回答 3

3

中序遍历等价于迭代TreeMapa 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;
}
于 2012-08-19T03:39:15.813 回答
0

大部分代码应该在 inorder() 方法中。毫无疑问它实际上是,所以你有两个打印,所以你得到两个输出。searchFull() 方法应该做的就是调用 inorder(root)。

于 2012-08-19T04:53:28.080 回答
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() 方法将输入名称与节点进行比较,并根据名称是否按字母顺序向左或向右移动。

于 2012-08-19T04:00:51.483 回答