(配列の要素を分析することLRDのBSTかどう同じではありません)
本は:まず、二分探索木のために、左の部分木のルートノードのすべての要素が、右のサブツリー内のすべての要素よりも少ない未満であり、その後、シーケンス後の最後の要素トラバーサル順序がルートである、これは知られている私たちの条件があります。この質問は、共通のバイナリツリー(またはそれ以降)トラバーサル配列と連想させる先行順プリアンブルシーケンスであるプラスあなたは、バイナリツリーを復元することができ、その質問に、私たちは、プリアンブルシーケンスまたは順序のことができるようになることを知っています彼らは、ルートノードを整理し始めたが、我々は、サブツリーの数を決定することができないので、それはサブツリーの範囲を決定するための補助シーケンスを必要とします。BSTまたは注文トラバーサルシーケンスの前文の変化は、私たちが直接バイナリツリーを整理することができた場合でも、BSTは、私たちは、サブツリーの範囲を決定するのを助けるために備えています。この質問のために、我々は配列を決定する必要があるBSTの後順トラバーサルの順序ではない、同じアイディアは、ルートノードを決定するために使用することができますが、バイナリツリーを再構築する必要はありません、我々は二つの配列を決定する必要があり、現在の再帰では有効ではありませんライン上。私たちは、ルートノード(最後の要素)を最初に見つけ、その後、スプリットポイントの右側を決定するために、サブツリーについての分割ポイントを見つけるためにそれを使用すると、ルートよりも大きくない、それは二つのサブ分割に行ってきました場合は再帰的に分割されたポイントの左と右の上の点をご確認くださいシーケンス。
public boolean judge(int[] a){
if(a == null)return false;
if(a.length == 0)return true;
return myJudge(a, 0, a.length-1);
}
private boolean myJudge(int[] a, int start, int end){
//加上等号也可以
if(start > end)return true;
int leftEnd = start-1;
for(int i=start; i<=end-1; i++){
if(a[i]<a[end]){
leftEnd++;
}
}
for(int i=leftEnd+1; i<=end-1; i++){
if(a[i] < a[end]){
return false;
}
}
return myJudge(a, start, leftEnd) && myJudge(a, leftEnd+1, end-1);
}