トピック:
多くのデータ構造の中で、バイナリツリーは、アプリケーションの広い範囲で、特別かつ重要な構造です。またはバイナリツリーノード、またはルート一つとバイナリビットの唯一のノードを有し、残りのノードは、サブセットとして、左、右、および他のように、2つの互いに素な部分集合、一つのサブセットに分割されます。各サブセットは、バイナリツリーです。
バイナリ検索を横断する各ノードは、各ノードが一度訪問され、一度だけアクセスされるように、旅行経路にタップされます。ナビゲートするための3つの最も一般的な方法があります。
(1)トラバーサルをプレオーダー:バイナリツリーは、エアオペレーション空であれば、そうでない場合、最初は、最終の前に、それ以前に左サブツリー順序を横切る、右サブツリートラバーサルシーケンスをルートノードを訪問します。
(2)プレオーダー:バイナリツリーが空、空であれば、そうでない場合、ルートノードを訪問し、その後、第1の左サブツリーを前順、及び最終的に先行予約右サブツリー。
(3)注文トラバーサルをバイナリツリーは、エアオペレーション空であれば、そうでない場合トラバーサルは、右サブツリー順序トラバーサルをサブツリーを左に、そして最終的にルートノードにアクセスしたプレオーダー。
例えば、図1に示すABCD、シーケンスの先行予約を横断される配列の前に二分木はCBAD、後順トラバーサル順序はCBDAあります。
先行順走査順序とノードのアクセス順序は、注文後順トラバーサルが一意に決定される前に与えられた場合には、バイナリツリーの、それも見つけることは非常に簡単です。しかし、我々は唯一のトラバーサル順序は、例えば、不確実である順序どおり、プリアンブルとトラバーサルの帰りがけ順の順序を知っている場合:、先行順走査順序はABCDで、注文を横断するCBDAで、2つのバイナリツリー出会いがありますこのシーケンスは、図1と図2を参照してください。
問題は、今与えられた順序及びこれを満たすために、バイナリツリートラバーサル順序の異なる形態の木の総数を必要後順序トラバーサル順トラバーサル、前です。
プログラム:
方法1:
暴力バイナリツリー構造は、判決の要件を満たしています。
予想スコア:10
方法2:
直接出力サンプル
スコア:30
正解:
私たちが逆さまに横断するためにフォローアップを見てみると、順序が左右のルーツとなります。
二つのノードが互いに接続され、2つのトラバーサルで同じであるリーフノードは、あるている場合。
時間のためのスペース:隣接行列を最適化することができます。
実際には、最適化することはできません
コード:
1の#include <cstdioを> 2の#include <CStringの> 3の#include <iostreamの> 4 使って 名前空間STDを、 5 長い 長電源(INT X){ 6 長い 長い T = 1 。 7 のために(int型 i = 0 ; iはXを<; iは++ ){ 8 T * = 2 ; 9 } 10 リターンT。 11 } 12 INT メイン(){ 13 // freopenは( "tree.in"、 "R"、STDIN)。 14 // freopenは( "tree.out"、 "W"、STDOUT)。 15 チャーファー[ 100000 ]、秒[ 100000 ]。 16 CIN >> FIR >> 秒。 17 INT LEN = STRLEN(FIR)。 18 であれば(LEN == 1)COUT << 1 。 19 他{ 20 int型の和= 0 。 21 のためには、(int型 = Iを0 ; iは<len- 1 ; I ++ ){ 22 のために(INT J = len- 1 ; J>0 ; j-- ){ 23 であれば(FIR [I] ==秒[J] &&モミ[I + 1 ] ==秒[J- 1 ]){ 24 和++ 。 25 ブレーク; 26 } 27 } 28 } 29 COUT << 電源(合計)。 30 } 31 リターン 0 。 32 }