2013-01-15 22 views
5

私は、最大両端ヒープを実装しています。これはダブルエンド優先順位キューの一種です。 min-maxヒープの詳細については、hereを参照してください。最小最大ヒープでの最大操作の削除

挿入操作と削除操作のコードは単純でネット上で利用できます。しかし、私はまた、delete-max操作をmin-maxヒープで実装しようとしています。

最初は、max-minヒープでdelete-maxヒープと同じになると感じました(最大要素を含むmin-maxヒープのサブツリーを考えてみると、 minヒープ)。したがって、実装はmin-maxヒープのdelete-minとシンプルで類似しています。

しかし、問題がある: enter image description here

70は、最大要素であり、最小 - 最大ヒープの最後の要素(12)はしていないが、上記の図に見られるように70を含むサブツリーです。したがって、70の削除後に左のサブツリーに残っているギャップを置き換えるために使用できますか?

max-minヒープのdelete-maxプロシージャを実行し、ギャップを置き換えるために20を使用すると、ヒープに挿入される次の要素は10の右の子になり、永遠に9の右の子供が存在しません。

だから誰でも助けてくれますか?

+3

ランダムキーの削除に関する質問は、delete-maxの後にヒープを修正する方法に関する質問とは異なりますので、別の質問として尋ねます。 – templatetypedef

+0

@templatetypedefこの問題を「最大要素を削除する方法」に焦点を当てて編集しました。ここでは、「min-maxヒープからノードを削除する方法」に関する提案された解決策を使って特定の質問を見つけることができます:http://stackoverflow.com/q/39392864/3924118 – nbro

答えて

3

最後のレベルの右端のノードを削除し、ツリー内で交差しても削除されたmax要素を置き換えることは正しいと思います。より依然として小さい分レベルですべてのノード:そのツリー内の任意のノードのために保持する必要が不変のいずれかを変更しない最後のレベルの右端ノードを削除

  1. :根拠は以下でありますそれらの子孫のすべて、および最高レベルのすべてのノードは、依然として子孫よりも大きいです。

  2. ツリーはまだ完全なバイナリツリーです。あなたは、このノード上に移動した後

は、あなたがして、左部分木の不変量は依然として保持することを確実にするために最大 - 最小ヒープ内の通常のフィックスアップ手順を使用することができます。

希望すると便利です。

+0

これは私が実装した方法です。私は数ヶ月前にmin-max-heapデータ構造を書いていました。 (+1) –

+0

これは、min-maxヒープ内の_maximum_要素を削除しますが、これはmin-maxヒープ内のどのノードでも有効ですか?はいの場合、正確にどのフィックスアップを使用しますか? 「トリクルダウン」操作をしてもうまくいかない場合は、問題を示すこの要点に行った唯一のコメントを確認してください:https://gist.github.com/gnarmis/4647645 – nbro

関連する問題