①タイトル
整数配列を入力して、アレイは、バイナリ検索ツリーをトラバースした後決意の結果ではありません。出力がYesであれば、そうでなければ出力号 任意の2つの数の入力配列が異なっていると仮定する。
②アイデア
図1は、アレイの後続の走査で、最後の要素がルートです。
各要素の2、BST、各要素の左の部分木は、<ルート<右サブツリー
図3は、先頭からビット0は、最初の>ルート要素は、この記録位置Iを見つけます。この位置の前(この場合には、左の部分木のルートノードよりも少ないと結論付けている)左サブツリーに属し
4、ノードと右サブツリーを超えるかどうかを確認し(ルートノードの前に第i番目のビットから開始)
図5は、すなわち、繰り返し3-4ステップ、BSTが属しているかどうかを再帰的に決定された左及び右サブツリー。
③コード
1 パブリック クラスソリューション{ 2 公共 ブール VerifySquenceOfBST(INT []配列){ 3 ブール [] RES = 新しい新しい ブール [1 ]; 4つの RES [0] = trueに、 5 IF(sequence.length == 0) // 入力する場合直接バックfalseに、次いで、空である 。6 リターン falseに、 図7 isBST(0 ,. 1- sequence.length、RES、シーケンス); // 、関数はRES [0]種々の条件に応じて決定される場合、変更することができる機能を呼び出す 。8つの リターン RES [ 0 ]; 9 } 10 11 公衆 INT isBST(INTスタート、INTエンド、ブール [] RES、値int []配列){ 12は IF(=スタート>終了) // 1種終了条件 13が 返す開始を、 14 INT MID =(スタート+エンド)> >> 1; // 2で割った 15 INT curr_root = [終了]配列; 16 INT iが=スタート; // このステップは、のためにループに書き込むことができない、そうでなければ私はライン21にエラーを認識しないであろう 17 のために(; I <END; I ++は){ 18は IF(配列[I]> curr_root) 19。 BREAK; // 最初の>ルート要素が直ちに抜け出す見つかった後 20である } 21がある ため(INT J = I; J <END; J ++ ){ 22は、 IF(配列[J] < {curr_root) 23が RES [0] = 偽 ; // 変更RES [0]の値が 24 リターンスタート; // isBSTこの機能だけで解像度を変更するには[0]の値は、これだけの行に何かを返す、例えば、私はスタート返す 25 } 26 } 27 isBSTを(,. 1-MID、RES、シーケンススタート); // 再帰分析左サブツリー、 28 isBST(MID、-End 1、RES、シーケンス。); //再帰右サブツリー決定 29 リターンスタート; 30 } 31です }
④学びました
1は、108個の質問Leeccodeを行うので、ライン14個の質問で使用法>>>に書き込みます。
2、我々は判断がBSTではないの後に順番を反復処理する方法を学ばなければならない、この質問のポイント②の分析です。
図3は、解像度を変更するには、[0]フラグを、全体isBST機能に重要ではありません何を返すために、この関数の戻り値をisBST [0]値をRESを使用して、これは「プログラマーコードのインタビューから私にアプローチガイド:IT企業名タイトルアルゴリズムとデータ構造、最適なソリューション、「145を学びました。