1. 程式人生 > >劍指offer二十三之二叉搜索樹的後序遍歷序列

劍指offer二十三之二叉搜索樹的後序遍歷序列

[] 如果 數據 quest term start 只需要 遞歸 ret

一、題目

  輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。

二、思路

1、二叉搜索樹又稱二叉排序樹(Binary Sort Tree)或二叉查找樹(Binary Search Tree)。二叉搜索樹或者是一棵空樹,或者是具有下列性質的二叉樹:

 (1)若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值;  (2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;  (3)左、右子樹也分別為二叉搜索樹。 技術分享 2、對於後序遍歷來說,序列數組的最後一個元素一定是根節點, 則根據這個元素,將前面的數組分為左、右兩個部分,左側部分都小,右側部分都大,如果右側部分有比該根節點小的元素,那麽就不是後序遍歷,如此遞歸進行。

三、代碼

技術分享
    public boolean VerifySquenceOfBST(int[] sequence) {
        if (sequence == null || sequence.length == 0) {
            return false;
        }

        boolean flag = isBST(sequence, 0, sequence.length - 1);

        return flag;
    }

    public  boolean isBST(int[] arr, int start, int end) {
    
//所有子序列都檢驗完成,沒有錯,返回true if (start>= end) { return true; } // 當前數組(從start到end部分)的根節點 int curElement = arr[end]; int splitIndex; // 找到比curElement大和比curElement小的分界點,分成左側、右側兩組數據 for (splitIndex = start; splitIndex < end && arr[splitIndex] < curElement; splitIndex++) ;
// 只需要看右側即可,因為前面的for循環,已經確保左側部分全部都小於curElement for (int i = splitIndex; i < end; i++) { if (arr[i] < curElement) { return false; } } return isBST(arr, start, splitIndex - 1) && isBST(arr, splitIndex, end - 1); }
View Code

-----------------------------------------------------------------------------------

參考鏈接:https://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90e447bafd

劍指offer二十三之二叉搜索樹的後序遍歷序列