Java クラス TreeMap は RB ツリーの実装を使用していると聞いています。この場合、TreeMap で順序、事前順序、および事後順序のツリー ウォークを行うにはどうすればよいでしょうか。
それとも、これは不可能ですか?
Java クラス TreeMap は RB ツリーの実装を使用していると聞いています。この場合、TreeMap で順序、事前順序、および事後順序のツリー ウォークを行うにはどうすればよいでしょうか。
それとも、これは不可能ですか?
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 つの順序すべてでツリーをたどる独自のメソッドを作成できるかもしれません。
私の知る限り、TreeSet/TreeMap クラスは実際には内部を公開しておらず、単に Set/Map インターフェースに準拠しています。イテレータは昇順であることが保証されています。
これらのツリーの目的は、オブジェクト間の関係 (数式など) を表すことではなく、単にそれらすべてを格納して効率的に取得することであるため、これらのノードを順番にスキャンする理由について少し困惑しています。
少なくとも、反復子と 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 はツリーの仕組みをまったく公開していないため、このビューでは事前注文または事後注文はできません。