二分探索木の高さを最小化しようとしている場合、これらは正しい手順ですか?:
1)ツリーからソートされた配列を生成します2)ソートされた要素を順番にツリーに追加してツリーを再構築します
二分探索木の高さを最小化しようとしている場合、これらは正しい手順ですか?:
1)ツリーからソートされた配列を生成します2)ソートされた要素を順番にツリーに追加してツリーを再構築します
すでに並べ替えられたリストを単純な非平衡二分探索木に追加すると、二分探索木の理論上の最悪のケースが構築されます。最も低い値のノードがルートであり、すべてのノードがリスト内でその直前のノードの「右側」に追加され、O(lg n)ではなくO(n)時間で検索して最大深度のツリーを作成します。 )。事実上、過度に複雑なリンクリストを作成しているだけです。
要素を並べ替えた後、中央の要素をルートノードとして定義してツリーを再構築し、中央の前後の要素からそれぞれ左と右のサブツリーを再帰的に構築します。
でソートされた要素を挿入する前にツリー構造を再構築するとinorder
、提供するソリューションが正しくなると思います。
たとえば、元のツリーが次のような場合:
(5)
(3) (6)
(2) (4)
(1)
次のようにツリーを再構築します。
()
() ()
() () ()
ソートされた要素をinorder
次のように挿入します: 1、2、3、4、5、6
(4)
(2) (6)
(1) (3) (5)
ツリーにアクセスでき、「手動で」変更できると思います。バランスの問題は次のように解決できると思います(擬似コード):
depth(node)
{
if node is null, return 0;
l = depth(left child);
r = depth(right child);
diff = (r - l);
if (diff < -1) rotate right (as often as you need);
else if (diff > 1) rotate left (as often as you need);
return the new maximum depth of both subtrees +1;
}
告白する必要があります。これについてはよくわかりませんが、ツリーをトラバースして正しい回転を適用する必要があるため、一時配列は必要ないという考えです。