インターネットのどこかでこの質問を見て、解決しようとしました。ヒープが厳密にバイナリ ツリーである場合は解決できましたが (プリオーダー トラバーサルを繰り返し分割することにより)、ヒープが完全なバイナリ ツリーにすぎない場合のアルゴリズムを理解できませんでした。
たとえば1, 2, 3, 4, 5, 6, 7
、最小ヒープの事前順トラバーサルの場合、
ヒープのサイズは7
1
ヒープ内の最初の要素です (ヒープが配列として表されていることを考慮して)
次の(size - 1) / 2
要素は、の左側のサブツリーにあります1
2, 3, 4
の左側のサブツリーになります1
最後の(size - 1) / 2
要素は、の右サブツリーにあります1
5, 6, 7
の右側のサブツリーになります1
このロジックを再帰的に適用することで、完全なヒープを構築できます。
このソリューションは、ヒープが厳密にバイナリ ツリーであるような場合に機能します。
1
2 3
4 5 6 7
しかし明らかに、これは非リーフ要素が 1 つまたはまったく子を持たないヒープの場合には機能しません。たとえば、
1 1
2 3 2 3
4 5 6 4 5
同じことができるクリーンなアルゴリズムは思いつきませんでした。解決策/提案は本当に役に立ちます。