【劍指offer較難部分9】二叉搜尋樹的後序遍歷序列(java)
阿新 • • 發佈:2021-01-18
技術標籤:劍指offer(java)資料結構演算法二叉樹java
題目描述
輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。
分析
思路:
1、由後序遍歷的特點可知,最後一個結點即為根節點,設為rootVal
2、根節點會將二叉搜尋樹,分為兩部分,左半部分和右半部分
3、左半部分都小於根節點值,右半部分都大於根節點值
4、得到兩部分後,子樹又可以像上述一樣,確定子樹根節點,然後又分兩部分,如此往復
實現程式碼:
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
int len = sequence.length;
if (sequence == null || len == 0) {
return false;
}
boolean result = verifySquenceOfBST(sequence, 0, len - 1);
return result;
}
private boolean verifySquenceOfBST(int [] sequence, int begin, int end) {
// 一個元素時,為後序遍歷序列,可能只有兩個數,根節點+其他一個數,那麼此時begin傳的值為leftEnd+1,就會比end大
if (begin >= end) {
return true;
}
// root節點的值
int rootVal = sequence[end];
// 序列中的最後一個左子樹節點,一開始是seq[0]
int leftEnd = begin;
int i = begin;
// 遍歷找到左子樹的序列 與 右子樹序列, 獲取分割索引
while (sequence[i] < rootVal) {
leftEnd = i;
i++;
}
// 判斷leftEnd序列後的值,如果存在元素小於rootVal,則不是後序序列
while (i < end) {
if (sequence[i] < rootVal) {
return false;
}
i++;
}
//根節點將樹分成兩部分後,繼續遞迴遍歷左右子樹
return verifySquenceOfBST(sequence, begin, leftEnd) && verifySquenceOfBST(sequence, leftEnd+1, end-1);
}
}