33.二叉搜索樹的後序遍歷序列
面試題33. 二叉搜索樹的後序遍歷序列
難度中等39
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷結果。如果是則返回 true,否則返回
false。假設輸入的數組的任意兩個數字都互不相同。參考以下這顆二叉搜索樹:
5 / \ 2 6 / \ 1 3
示例 1:
輸入: [1,6,3,2,5] 輸出: false
示例 2:
輸入: [1,3,2,6,5] 輸出: true
1.遞歸-分治
時間複雜度:O(n^2) 每次調用 recur(i,j) 減去一個根節點,因此遞歸佔用 O(N) ;最差情況下(即當樹退化爲鏈表),每輪遞歸都需遍歷樹所有節點,佔用 O(N)
空間複雜度 O(N) : 最差情況下(即當樹退化爲鏈表),遞歸深度將達到 NN 。
//遞歸 --分治
//後序遍歷 左右根 特點左子樹節點的值均小於根節點 右子樹節點的值均大於根節點
//由此可知 數組中最後一個元素就是跟節點。通過兩次for 找到第一個大於root.val的值
//將數組劃分成 小於根節點的 和 大於根節點的 兩部分,通過遞歸調用 就可以逐一比較。
public boolean verifyPostorder(int[] postorder) {
if(postorder == null || postorder.length == 0){
return true;
}
return verify(postorder,0,postorder.length-1);
}
public boolean verify(int [] postorder,int first,int last){
if(last-first<=1){ //如果數組中只有一個元素 說明是有序的。
return true;
}
int curIndex = first;
int rootVal = postorder[last];//根節點
//找到第一個大於根節點的值 下標
while(curIndex < last && postorder[curIndex]<=rootVal ){
curIndex++;
}
for(int i = curIndex;i<last;i++){
//如果右子節點小於根節點 不是BST
if(postorder[i]<rootVal){
return false;
}
}
return verify(postorder,first,curIndex-1) && verify(postorder,curIndex,last-1);
}