2012-01-11 9 views
3

ベクトルベースの反復プロセスだけでなく再帰も、両方ともDFSツリー(bツリー)の探索に使用できます。どちらの場合も、再帰呼び出し中またはベクトル内でスタックに余分なスペースが必要です。宇宙を必要とせず、最小限のスペースが必要な技術は存在しますか?DFSは再帰と余分なスペースなしで可能ですか?

答えて

3

バイナリツリーを検索している場合、各パスをビットのパターンとして表すことができます。したがって、ルートポイントから下向きに検索し、バイナリ語のビットをつぶやくことによって進行状況を把握することができます。各レベルに1ビット必要です。

 A 
    /\ 
    B C 
    /\ \ 
    D E F 

Aで検索を開始すると、ABDで指定された検索は00(左 - 左)です。次は01、左右に対応するABEです。 10はA-C-子供なし。 11はACFです。

最下位ビットは、トラバーサルの最後に向ける方向を示します(つまり、リーフを選択します)。ビットシーケンスが他の方法で読み取られる場合、このメソッドは幅優先トラバーサルを指定します。

情報を少なく保存した結果、同じノードに再度アクセスします。

これはデータのリニアスキャンに相当するため、ツリーを持つ利点が損なわれることに注意してください。スタック余裕ができないスペースがある場合は、あらかじめ割り当てられたベクトルを使用することをお勧めします。これをソートしておくと、バイナリ検索などの処理を行うことができます。バイナリ検索はこれよりも効率的です。

+0

あなたの投稿は面白そうです。しかし、あなたが小さな例でいつかそれを広げてください、私はあなたの時間が多くの読者に価値があると思います。 – Abhinav

+0

@abhinav:上記の私の編集をチェックしてください。ありがとうございます; – Marcin

+0

;当然のことながら、私たちは00000から始まると言います...最も左にあることを示し、最終的に11111に終わります...右端を示します。 ありがとう – Abhinav

3

ツリーをトラバースするために必要なスペースは、ログ(N)スペースで最悪の場合でも実行できます。ノードが単一のブランチである場合は、O(1)スペース/メモリのパフォーマンスを使用して行うことができます。しかし、ログ(N)のパフォーマンスは実際には小さいです。 2^300ノード(この宇宙には収まらない)があると想像すれば、300のような検索に必要なスペースがあり、数KBのRAMに収まることができます。

+0

+1のデータを含む明確なステートメント。 – Abhinav

+0

これはMarcinの答えの論点すべてと矛盾していませんか?ルートに左と右の両方の子がある木を考えてみましょう。そして、それぞれの左の子は、子を残しました。「n回」、それぞれの右の子は、右の子しか持っていません。このツリーをトラバースすると(この構造を知らないと、 'max(n、m)'最悪の場合のスペースが必要になります。私は 'n'と' m'を2^299にすることができます。その場合、ツリーは2^300 + 1個のノードを持ちます。私はあなたの答えがバランスのとれた木だけに有効だと思います。 – TWiStErRob

+0

@ TWiStErRobこのようなツリーは、再帰や他の手を探す必要がないため、O(1)空間でテール再帰呼び出しとして表現できるので、一定のスペースを使用して移動できます。そのような場合、素朴な再帰的なトラバースにはO(N)時間がかかることに同意しますが、実際の問題は、O(1)スペースを必要とする非再帰的ソリューションを作ることが可能であり、 –

関連する問題