面試題33:二叉搜索樹(shù)的后序遍歷序列

輸入一個(gè)整數(shù)數(shù)組搞挣,判斷該數(shù)組是不是某二叉搜索樹(shù)的后序遍歷的結(jié)果。假設(shè)輸入的數(shù)組的任意兩個(gè)數(shù)字都互不相同券盅。

思路一:
使用遞歸频敛,遞歸參數(shù)為序列以及開(kāi)始結(jié)束節(jié)點(diǎn)项郊,后序序列必然滿足最后一個(gè)節(jié)點(diǎn)作為根節(jié)點(diǎn),前面分為兩部分姻政,一部分連續(xù)比根節(jié)點(diǎn)大呆抑,一部分連續(xù)比根節(jié)點(diǎn)小。每次循環(huán)找出分界點(diǎn)汁展,根據(jù)分界點(diǎn)遞歸鹊碍,出現(xiàn)一部分不滿足便是不滿足。
代碼如下:

/**
     * 思路:
     * 已知條件:后序序列最后一個(gè)值為root食绿;二叉搜索樹(shù)左子樹(shù)值都比root小侈咕,右子樹(shù)值都比root大。
     * 1器紧、確定root耀销;
     * 2、遍歷序列(除去root結(jié)點(diǎn))铲汪,找到第一個(gè)大于root的位置熊尉,則該位置左邊為左子樹(shù),右邊為右子樹(shù)掌腰;
     * 3狰住、遍歷右子樹(shù),若發(fā)現(xiàn)有小于root的值,則直接返回false;
     * 4窖贤、分別判斷左子樹(shù)和右子樹(shù)是否仍是二叉搜索樹(shù)(即遞歸步驟1、2创南、3)。
     * @param sequence
     * @return
     */
    public boolean VerifySquenceOfBST(int [] sequence) {
        if (sequence == null || sequence.length <= 0){
            return false;
        }
        return isSearchBST(sequence,0,sequence.length-1);
    }

    private boolean isSearchBST(int[] sequence, int begin, int end) {
        //如果索引相等省核,必然為葉節(jié)點(diǎn)稿辙,如果小于必然不存在左子樹(shù)或者右子樹(shù)
        if (begin >= end) return true;

        int rootVal = sequence[end];
        int i = begin;
        //保證循環(huán)不越界
        while (sequence[i] < rootVal && i < end){
            i++;
        }
        //找到第一個(gè)大于根節(jié)點(diǎn)的作為分界點(diǎn)
        int bound = i;
        while (i < end){
            //不越界情況下,出現(xiàn)小于則肯定不是
            if (sequence[i] < rootVal) return false;
            i++;
        }
        //子樹(shù)遞歸
        return isSearchBST(sequence,begin,bound-1) && isSearchBST(sequence,bound,end-1);
    }

思路二:非遞歸循環(huán)解決气忠,從后往前的所有數(shù)字邻储,對(duì)于它前面的數(shù)字要么連續(xù)比它小未桥,要么連續(xù)比它大,按照先比小芥备,后比大的兩個(gè)循環(huán),如果最終順利到達(dá)當(dāng)前數(shù)字舌菜,即滿足萌壳,否則肯定不滿足。

/**
     * 非遞歸
     * 非遞歸也是一個(gè)基于遞歸的思想:
     * 左子樹(shù)一定比右子樹(shù)小日月,因此去掉根后袱瓮,數(shù)字分為left,right兩部分爱咬,right部分的
     * 最后一個(gè)數(shù)字是右子樹(shù)的根他也比左子樹(shù)所有值大尺借,因此我們可以每次只看有子樹(shù)是否符合條件
     * 即可,即使到達(dá)了左子樹(shù)左子樹(shù)也可以看出由左右子樹(shù)組成的樹(shù)還像右子樹(shù)那樣處理
     *
     * 對(duì)于左子樹(shù)回到了原問(wèn)題精拟,對(duì)于右子樹(shù)燎斩,左子樹(shù)的所有值都比右子樹(shù)的根小可以暫時(shí)把他看出右子樹(shù)的左子樹(shù)
     * 只需看看右子樹(shù)的右子樹(shù)是否符合要求即可
     */

    public boolean VerifySquenceOfBST1(int [] sequence) {
        int size = sequence.length;
        if (sequence == null || size <= 0){
            return false;
        }
        int i = 0;
        while (--size >= 0){
            while (sequence[i] < sequence[size]) i++;
            while (sequence[i] > sequence[size]) i++;
            //如果前面出現(xiàn)大小順序顛倒,不滿足先小后大的條件蜂绎,循環(huán)提前終止
            if (i < size) return false;
            i = 0;
        }
        return true;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末栅表,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子师枣,更是在濱河造成了極大的恐慌怪瓶,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件践美,死亡現(xiàn)場(chǎng)離奇詭異洗贰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)陨倡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)敛滋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人玫膀,你說(shuō)我怎么就攤上這事矛缨。” “怎么了帖旨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵箕昭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我解阅,道長(zhǎng)落竹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任货抄,我火速辦了婚禮述召,結(jié)果婚禮上朱转,老公的妹妹穿的比我還像新娘。我一直安慰自己积暖,他們只是感情好藤为,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著夺刑,像睡著了一般缅疟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遍愿,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天存淫,我揣著相機(jī)與錄音,去河邊找鬼沼填。 笑死桅咆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坞笙。 我是一名探鬼主播岩饼,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼羞海!你這毒婦竟也來(lái)了忌愚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤却邓,失蹤者是張志新(化名)和其女友劉穎硕糊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腊徙,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡简十,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撬腾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螟蝙。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖民傻,靈堂內(nèi)的尸體忽然破棺而出胰默,到底是詐尸還是另有隱情,我是刑警寧澤漓踢,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布牵署,位于F島的核電站,受9級(jí)特大地震影響喧半,放射性物質(zhì)發(fā)生泄漏奴迅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一挺据、第九天 我趴在偏房一處隱蔽的房頂上張望取具。 院中可真熱鬧脖隶,春花似錦、人聲如沸暇检。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)块仆。三九已至心墅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榨乎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工瘫筐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜜暑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓策肝,卻偏偏與公主長(zhǎng)得像肛捍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子之众,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容