---恢復內容開始---
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的后序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
判斷一個數組是否是二叉查找樹的后序遍歷的結果首先要知道二叉查找樹的后序遍歷是怎么樣的。
二叉查找樹的特點:在除了葉子節點之外的其它節點中,節點的左子樹的任意一個數不大於這個節點,右子樹的任意一個數不小於這個節點。
二叉樹的后序遍歷:對於一個序列S,最后一個元素是x (也就是根),如果去掉最后一個元素的序列為T,那么T滿足:T可以分成兩段,前一段(左子樹)小於x,后一段(右子樹)大於x,且這兩段(子樹)都是合法的后序序列。
遞歸判斷T是不是都是二叉樹的后序遍歷。
public class Solution { public boolean VerifySquenceOfBST(int[] sequence) { if (sequence == null || sequence.length == 0) { return false; } return verifySquenceOfBST(sequence, 0, sequence.length - 1); } boolean verifySquenceOfBST(int[] sequence, int start, int end) { if (start == end) { return true; } int key = sequence[end]; int i = start; for (; i < end; i++) { if (sequence[i] > key) {//找到比最后一個元素大的第一個元素,確認這個T的左子樹和右子樹 break; } } int m = i; for (; i < end; i++) { if (sequence[i] < key) {//如果右子樹中是否有比最后一個元素小的元素,返回false return false; } } if (m == start || m == end) {//所有元素都比最后一個元素小的情況,即這個序列T只有左子樹,此時繼續判斷它的左子樹。 第一個元素比最后一個元素大時,同理, //繼續判斷它的右子樹 return verifySquenceOfBST(sequence, start, end - 1); } else { return verifySquenceOfBST(sequence, start, m - 1) && verifySquenceOfBST(sequence, m, end - 1); } } }