5

Java クラス TreeMap は RB ツリーの実装を使用していると聞いています。この場合、TreeMap で順序、事前順序、および事後順序のツリー ウォークを行うにはどうすればよいでしょうか。

それとも、これは不可能ですか?

4

3 に答える 3

6

Collections ライブラリに実装されている TreeMap では、これを行うことはできません。Java でのRed-Black Treeの実装を次に示します。メソッドをチェックしてprintTree()、ソートされた順序でツリーをたどる方法を確認してください。

/**
 * Print all items.
 */
public void printTree( ) {
    printTree( header.right );
}

/**
 * Internal method to print a subtree in sorted order.
 * @param t the node that roots the tree.
 */
private void printTree( RedBlackNode t ) {
    if( t != nullNode ) {
        printTree( t.left );
        System.out.println( t.element );
        printTree( t.right );
    }
}

そこから、3 つの順序すべてでツリーをたどる独自のメソッドを作成できるかもしれません。

于 2008-12-03T03:45:52.327 に答える
3

私の知る限り、TreeSet/TreeMap クラスは実際には内部を公開しておらず、単に Set/Map インターフェースに準拠しています。イテレータは昇順であることが保証されています。

これらのツリーの目的は、オブジェクト間の関係 (数式など) を表すことではなく、単にそれらすべてを格納して効率的に取得することであるため、これらのノードを順番にスキャンする理由について少し困惑しています。

于 2008-12-03T03:35:25.233 に答える
3

少なくとも、反復子と for each ループを使用してインオーダー ウォークを実行できます。

void inOrderWalk(TreeMap<K,V> treeMap) {
   //this will loop through the values in the map in sorted order (inorder traversal)
   for (Map.Entry<K,V> entry : treeMap.entrySet() {
        V value = entry.getValue();
        K key = entry.getKey()
   }
}

ただし、他のポスターは正しいです。Java はツリーの仕組みをまったく公開していないため、このビューでは事前注文または事後注文はできません。

于 2008-12-03T21:38:41.553 に答える