ソードフィンガーオファー33.二分探索木の注文後のトラバーサルシーケンス
配列のポストオーダートラバーサル:左サブツリー-右サブツリー-ルートノード
ルートノードを取得し、配列セグメントを左から右にトラバースし、配列セグメントをルートノードより大きい最初の要素のインデックス(k)で除算します。
右側のサブツリーにルートノードよりも小さい要素がある場合はFalse
class Solution {
public boolean verifyPostorder(int[] postorder) {
if(postorder==null || postorder.length==0) return true;
return function(postorder,0,postorder.length-1);
}
private boolean function(int[] arr,int i,int j){
if(i>j) return true;
int root=arr[j];
int k=i;//k为大于根节点的第一个节点的下标
for(;k<j;k++){
if(arr[k]>root) break;
}
for(int a=k;a<j;a++){
if(arr[a]<root) return false;
}
boolean m=true,n=true;
if(k>i) m=function(arr,i,k-1);
if(k<j-1) n=function(arr,k,j-1);
return m&&n;
}
}