タイトル:整数配列を入力し、配列が先行順走査結果のバイナリ検索ツリーの後にないと判断されます。それはそうでない場合はfalse、trueを返す場合。任意の2つの数の入力配列が異なっていると仮定する。
}後続のバイナリ検索ツリートラバーサルの片のない結果が存在しないので、{入力配列{7,4,6,5である場合、例えば5,7,6,9,11,10,8入力アレイは、trueを返し}このシーケンスは、それゆえ、falseです。
配列先行予約得られたが、最後の番号は、ツリーのルートノードの値です。アレイ内の前の数字は、二つの部分に分けることができる:最初の部分は、ノードの左の部分木、それらの小さな値よりもルートノードの値であり、第二の部分は、ノードの右の部分木の値であり、それらの値よりもルートノード大規模な。
{} 5,7,6,9,11,10,8アレイは、例えば、結果後順8の最後の桁は、ルートノードの値です。この配列において、最初の3つの数字6,7,8、ノード8の値は、左の部分木のノードであるよりも小さい、8,9、11及び大10よりも3桁の値であります右部分木のノードノード8。
我々は、次の配列と同じ方法の各部分に対応するサブツリーの構造を決定しました。実際には、これは再帰的なプロセスです。配列5,7,6のために、6最後の番号はルートノードの左の部分木の値です。図7は、右の子ノードである図5〜6時間、6は、ノードの左の子ノードの値です。同様に、配列9,11,10において、最後の数字10は10に、ルートノード、小さな数字9の右の部分木であり、11は右の子である間、ノード10は、左の子ノードの値でありますノード。
私たちは別の配列{7,4,6,5}を分析してみましょう。後順最後ツリーはルートノードであるので、ルートノード5の値は、最初の数は7 5より大きいので、このようにして、対応する二分探索木、なし左サブツリーのルートノード、7つのフィギュア、値4、及び図6は、右の部分木のノードです。しかし、我々は5は、バイナリ検索ツリーの定義に反して、右のサブツリーのルートノードの値よりも小さい場合、ノードの値が4で発見しました。だから、二分探索木は、結果のその帰りがけ順が7,4,6,5で、何もありません。
public boolean verifySequenceOfBST(int[] array,int start,int end) throws Exception{
if(array == null||array.length<=0)
return false;
if(start < 0){
throw new Exception("first can't be less than 0");
}
if(end > array.length){
throw new Exception("last can't be greater than the count of the element.");
}
int root = array[end];
//在二叉搜索树中左子树的结点小于根节点
int i = start;
for(; i < end;i++){
if(array[i]>root)
break;
}
//在二叉搜索树中右子树的结点大于根节点
int j = i;
for(;j < end;j++){
if(array[j] < root)
return false;
}
//判断左子树是不是二叉搜索树
boolean left = true;
if(i >start)
left =verifySequenceOfBST(array ,start,i-1);
//判断右子树是不是二叉搜索树
boolean right = true;
if(i < end)
right =verifySequenceOfBST(array,i,end-1);
return (left && right);
}