題目:輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。若是是返回true,不然返回false。 假設輸入的數組任意兩個數字都不相同數組
解題思路:二叉搜索樹的特色是根節點的左子樹的值小於等於根節點的值,右子樹的結點的值大於等於根節點的值。 spa
在二叉樹的後序遍歷序列中,最後一個數字是樹的根節點。code
根據二叉搜索樹的後序遍歷特色,序列的前半部分是左子樹結點的值,他們都比根的值小;後半部分是右子樹結點的值,他們都比根的值大。blog
觸類旁通:要求處理一顆二叉樹的遍歷序列,能夠先找到二叉樹的根節點,在基於根節點把整棵樹的遍歷序列拆分紅左子樹對應的序列和右子樹對應的序列,接下來再遞歸的處理這兩個子序列。遞歸
package Solution; public class No24SequenceOfBinarySearchTree { public static void main(String[] args) { int[] array1 = { 5, 7, 6, 9, 11, 10, 8 }; System.out.println(verifySequenceOfBinarySearchTree(array1, 0, array1.length - 1)); int[] array2 = { 7, 1, 6, 5 }; System.out.println(verifySequenceOfBinarySearchTree(array2, 0, array2.length - 1)); } public static boolean verifySequenceOfBinarySearchTree(int[] array, int start, int end) { if (array == null || start > end || start < 0 || end < 0) return false; if (start == end) return true; int root = array[end]; int i = start; for (; i < end; i++) { if (array[i] > root) break; } int j = i; for (; j <= end; j++) { if (array[j] < root) return false; } // 遞歸判斷左子樹是否是二叉搜索樹 boolean left = false; if (i > start) { left = verifySequenceOfBinarySearchTree(array, start, i - 1); } // 遞歸判斷右子樹是否是二叉搜索樹 boolean right = false; if (i < end) { right = verifySequenceOfBinarySearchTree(array, i, end - 1); } return left && right; } }