【劍指Offer題解:java】二叉搜尋樹的後序遍歷
阿新 • • 發佈:2021-02-07
技術標籤:# 劍指Offer題解資料結構演算法二叉樹javaleetcode
文章目錄
題目
輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。
分析
直接利用二叉樹後序遍歷的陣列的最後一個數是該樹的根節點的性質,將樹劃分成左右兩個陣列,兩個陣列必須滿足【左邊資料小於根節點,右邊陣列大於跟節點】。
程式碼
/**
* 遞迴法:
* 二叉搜尋樹它的根結點總是對應該子樹的後序序列的最後一個數
* 那麼,只需要不斷地確定出左子樹區間和右子樹區間
* 並且判斷:左子樹區間的所有結點值 < 根結點值 < 右子樹區間所有結點值,這個條件是否滿足即可
*
* @param sequence
* @return
*/
public boolean VerifySquenceOfBST(int[] sequence) {
if (sequence == null || sequence.length == 0) return false;
return isBST(sequence, 0, sequence.length - 1);
}
/**
* 遞迴判斷是否為二叉樹的後序遍歷
* 滿足條件:
* 左子樹區間的所有結點值 < 根結點值 < 右子樹區間所有結點值
* @param sequence 陣列
* @param start 起始索引
* @param end 結束索引
* @return
*/
public boolean isBST(int[] sequence, int start, int end) {
if (start >= end) return true;
//當前子樹根節點為end索引所指向的值
int num = sequence[end];
//找到左右子樹的分界點,將當前的樹繼續分為左子樹和右子樹
int index;//儲存左右子樹分界點
for (index = start; index < end; index++) {
//當出現前一個數大於根節點時說明已經到了右子樹
if (sequence[index] > num) break;
}
//在右子樹查詢是否有值小於根節點,如果有則不滿足條件返回false
for (int i = index; i < end; i++) {
if (sequence[i] < num) return false;
}
return isBST(sequence, start, index - 1) && isBST(sequence, index, end - 1);
}