標準入力で与えられた順序でN個の一意の番号のキーを挿入するはずのバイナリ検索ツリーがあるとしたら、キーを持つすべてのノードを削除します間隔I = [min、max]であり、これらのノードに隣接するすべての接続も含む。これは私に、私が特定の方法で一緒にマージすることになるたくさんの小さな木を与えます。BST - 間隔の削除/複数のノードの削除
異なるキーと間隔Iを含むBSTの場合、間隔の削除は2つのフェーズで機能します。最初のフェーズでは、キーがIにあるすべてのノードと、削除されたノードに隣接するすべてのエッジを削除します。結果のグラフをk個の連結成分T1、...、Tkを含むものとする。各コンポーネントはBSTです。ここで、ルートは元のBSTのこのコンポーネントのすべてのノードの中で最小の深さを持つノードです。我々は木のシーケンスTiがソートされ、各iについて、< j、TiのすべてのキーがTjのキーよりも小さくなると仮定する。第2段階では、木材Tiが併合されて1つのBSTが形成される。この操作はMerge(T1、...、Tk)で表されます。その出力は次のように反復して定義されます:
EDIT:ノードを接続するエッジを削除することになります。これは、指定された間隔で区切られています。例2では、ノード10と20を接続するエッジが削除されます[13,15]は「それらの間に」あり、こうしてそれらを分ける。
ツリーの空のシーケンスの場合、Merge()は空のBSTを返します。 木Tを含む1要素シーケンスの場合、Merge(T)= T. 木のシーケンスT1、...、Tk(k> 1)について、A1 < A2 < ... <はシーケンスすべてのツリーT1、...、Tkの和集合に格納されたキーのうち、昇順にソートされたもの。また、m =⌊(1 + k)/2⌋とし、TsをAmを含む木とする。そして、Merge(T1、...、Tk)は3つの木Ts、TL = Merge(T1、...、Ts-1)とTR = Merge(Ts + 1、...、 Tk)。これらのツリーは、以下の2つのリンクを確立することによってマージされる.TLは、Tsの最小キーを格納するノードの左サブツリーとして付加され、TRはTsの最大キーを格納するノードの右サブツリーとして付加される。
これを実行した後、結果として得られるマージツリーの深さDと、深さD-1のノードの数を見つけることです。私のプログラムは、100000ノードのツリーであっても数秒で終了するはずです(第4例)。
私の問題は、これを行う方法や開始する場所についての手がかりがないことです。削除する前に目的のツリーを構築することができましたが、それはそれです。 私はこの問題やアドバイスを解決するプログラムの実装には感謝しています。好ましくは、いくつかのC言語プログラミング言語である。
例:
入力(最初の番号が空のツリーに挿入されるキーの数は、第二の所定の順序で挿入されるユニークキーであり、第三の行はに間隔を意味する2つの数値をcontaints )削除する:深さD-1で3 3
、最初の数は深さDである、ノードの第二の数
入力:
13
10 5 8 6 9 7 20 15 22 13 17 16 18
8 16
プログラムの正しい出力
13
10 5 8 6 9 7 20 15 22 13 17 16 18
13 15
正しい出力:4 3
例3:https://justpaste.it/1du6l 正しい出力:13 6
例4:link 正しい出力:58 9
あなたの第二パラは本当に元のエッジの除去を説明していません-2。 –
@ShihabShahriar申し訳ありませんが、私は気付かなかった、私は質問を編集しました。 –
マージ演算子の定義は、再帰的メソッドに直接変換されます。マージするツリーを見つけることは、ツリー全体を横切ることができれば簡単です。それをトラバースするだけで、削除されていないノードの外生的集合Uを同時に作成し、ポインタをヌルに設定することによって区間内のノードを削除する。次に、Uをトラバースして、U内に親を持たないU内のすべてのノードを見つける。これらは、マージするサブツリーのルーツである。あなたがその間隔でノードに触れることに自分自身を制限すれば、もう少し難しい問題です。 – Gene