1、タイトル説明:整数配列を入力して、アレイは、バイナリ検索ツリーをトラバースした後決意の結果ではありません。もし出力はい、そうでなければ出力号 任意の2つの数の入力配列が異なっていると仮定する。
2、アイデアは:バイナリ検索ツリーは、左サブツリー・ノードの値は、ノードの値未満である、値は、ノードの右サブツリーの値よりも大きいです。だから、二分探索木のシーケンスのために、左と右のトラバーサル順序のルートは、配列の最後の値は、ルートノードでなければならず、二分探索木の性質に応じて、左部分木のルートの値よりも小さい場合、右部分木の値よりも大きいですルートノードは、アレイを介し背面に前面から、あなたは、カットオフは左のサブツリーでなければならない前に、サブツリーの周りに予備の境界を見つけることが、カットオフは、すべての値がそれが右部分木であるかどうかを確認するために、ルートよりも大きいことを保証することはできません後にすることができます。キャリブレーションが完了した後、それは粗粒の状態で決定されるきめ細かいに完全準拠した二分探索木かどうかを決定するために反復法、ツリー全体に、それぞれ二分探索木、一度に左右サブツリーを、満たされ自然。
3、コード:
インポート java.utilのクラス*。; インポートするjava.lang。* ; パブリック クラスのソリューション{ パブリック ブール VerifySquenceOfBST(INT []シーケンス){ // 頑健性チェック IF(シーケンス== nullの || sequence.length == 0 ) { 戻り falseに; } int型の長さ= sequence.length; // 最後の番号がルートノードの配列の値である INTルート=配列[-length 1。]; // ルートノードの左の子ノードは、根ノードの右の子ノードよりも大きく、位置決め未満であります左と右のサブツリー国境 // 予備的境界、必ずしも必要ではないが、右部分木二分探索木に沿って定義されている int型0 = I ; のために(; I <-length 1; I ++ ){ IF(配列[I]> ルート){ BREAK ; } } // 右サブツリーバイナリツリーが定義するかどうかをチェック、即ち、全体が右サブツリーのルートよりも大きいです INT J = I; のための(; J <長さ- 1; J ++ ){ IF(配列[J] < ルート){ リターン falseに; } } // 再帰決意サブ内部ツリーについては、バイナリ検索ツリー法満たし ブール左= trueに、 ブール右= trueに、 IF(I> 0 ){ 左 = VerifySquenceOfBST(Arrays.copyOfRange(シーケンス、0 、I))。 } もし(I <(長さ-1 )){ 右 = VerifySquenceOfBST(Arrays.copyOfRange(シーケンス、I、長-1 ))。 } 戻り(&&左、右)。 } }