package cn.dzp.flyroc.offer; import java.util.Arrays; public class VerifySquenceOfBSTDemo { /*題目描述:輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。 若是是則輸出YES,不然輸出NO,假設輸入的數組的任意兩個數字都互不相同*/ /*思路:在後序遍歷的結果中,最後一個元素爲根節點; 從根節點開始掃描這個序列,比根節點小的,在左半部分; 比根節點大的,在右半部分。根據這樣的劃分,把序列劃分爲左右兩部分, 咱們遞歸地確認序列的左、右兩部分是否是都是二元查找樹。*/ /*實現步驟: * 1、判讀數組是否爲空,長度是否爲0 * 2、定義數組的長度,定義根節點的位置(數組中最後一個元素),定義一個標記 * 3、判斷左子樹是否是小於根節點的值 * 4、判斷右子樹是否是大於根節點的值 * 5、遞歸遍歷左右子樹*/ //代碼實現 public class TreeNode{ //定義TreeNode類 int val; TreeNode left; TreeNode right; TreeNode(int val){ this.val = val; } } public static boolean verifySquenceOfBST(int[] arr){ //判斷數組是否爲空,長度是否爲0 if (arr == null || arr.length == 0){ System.out.println("NO"); return false; } int leng = arr.length; //定義數組的長度 int root = arr[leng - 1]; //定義根節點 boolean flag = false; //定義標記 //判斷左子樹是否是小於根節點的值 int i; for (i = 0; i < leng-1; i++){ if (arr[i] < root){ flag = true; }else { break; } } //判斷右子樹是否大於根節點 for (int j = i; j < leng-1; j++){ if (arr[j] > root){ System.out.println("YES"); flag = true; return flag; }else { flag = false; return flag; } } //遞歸遍歷左右子樹 boolean left = true; if (i > 0){ //判斷左子樹是否成立 left = verifySquenceOfBST(Arrays.copyOfRange(arr,0, i)); } boolean right = true; if (i < leng-1){ //判斷右子樹是否成立 right = verifySquenceOfBST(Arrays.copyOfRange(arr, i ,leng -1)); } boolean result = left && right; return result; } }