劍指offer算法題023:二叉搜索樹的後序遍歷序列

小編在求職找找工作期間劍指offer上的算法題刷了很多遍,並且每道題小編當時都總結了一種最適合面試時手撕算法的最優解法。考慮到劍指offer算法題在面試中的高頻出現,小編每天和大家分享一道劍指offer上的算法題,以及小編總結的答案。下面是第023道劍指offer算法題:

題目描述

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

分析

經典的二叉樹題目,二叉樹的前中後層序遍歷相關算法一定要熟

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length==0)    return false;
        return verify(sequence,0,sequence.length-1);
    }
     
    private boolean verify(int[] nums,int low,int high){
        if(low<0 || high<0 || low>=high)    return true;
         
        int root = nums[high];
        //合法的BST由root節點把nums集合分爲兩部分了:一部分全部小於root;一部分全部大於root
        //我們需要判斷第一個大於root的節點和最後一個小於root的節點是否相鄰,相鄰即是合法的BST
        int firstGreator = -1;
        for(int i=low;i<high;i++){
            if(nums[i]>root){
                firstGreator = i;
                 break;
            }
        }
         
        int lastLess = -1;
        for(int i=high-1;i>=low;i--){
            if(nums[i]<root){
                lastLess = i;
                break;
            }
        }
        if(firstGreator!=-1 && lastLess!=-1 && firstGreator-lastLess!=1)    return false;
         
        //firstGreator=-1:全部小於root,表明只有左子樹
        //lastLess=-1:全部大於root,表明只有右子樹;
        return verify(nums,low,lastLess)&& verify(nums,firstGreator,high-1);
    }
}

注:在牛客網上刷劍指offer題目時,最好使用牛客網自帶的編輯器,不建議使用IDE的代碼補全功能,因爲實際面試中是在A4紙上手寫代碼,是沒有代碼提示的。

有些題你看懂了,不代表你會了。看答案前或者看完答案第二天,動手在A4紙上寫寫代碼就知道自己是不是真的會了。
每天分享一道劍指offer算法題目,並且有最適合面試手撕算法環節的解法分享,歡迎大家關注我們~

其他文章

1. 學習筆記和學習資料彙總:前端 + 後端 + java + 大數據 + python + 100多實戰項目 + C++

2. 我的秋招經歷總結:一站式秋招規劃

3. 零基礎學爬蟲

4. 零基礎C++學習總結

歡迎關注個人公衆號【菜鳥名企夢】,公衆號專注:互聯網求職面經javapython爬蟲大數據等技術分享:

公衆號菜鳥名企夢後臺發送“csdn”即可免費領取【csdn】和【百度文庫】下載服務;

公衆號菜鳥名企夢後臺發送“資料”:即可領取5T精品學習資料java面試考點java面經總結,以及幾十個java、大數據項目,資料很全,你想找的幾乎都有

掃碼關注,及時獲取更多精彩內容。(博主985、A+學科碩士,今日頭條大數據工程師)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章