1

二分探索木に格納されている検索名の結果を表示するためにinorderを使用しますが、例を実行すると、従業員名「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

TreeMap順序通りのトラバーサルは、 aの反復と同等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() メソッド内にある必要があります。間違いなく実際にはそうです。つまり、2 つのプリントがあるので、2 つの出力が得られます。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);

}

また、Inorder を検索する代わりに、BST で一般的な検索を行う方がよいでしょう。BST での順序検索は、実際には BST の目的全体を台無しにしてしまいます。String クラスの compareTo() メソッドを使用して入力 Name をノードと比較し、name がアルファベット順で後か前かに応じて、右または左に移動します。

于 2012-08-19T04:00:51.483 に答える