面試題33_二叉搜索樹的后序遍歷序列

題目描述

輸入一個整數(shù)數(shù)組灵再,判斷該數(shù)組是不是某二叉搜索樹的后序遍歷的結(jié)果。如果是則輸出Yes,否則輸出No蛇捌。假設(shè)輸入的數(shù)組的任意兩個數(shù)字都互不相同务漩。

題解

若一個樹為一個二叉搜索樹,則它左子樹上的節(jié)點一定比根節(jié)點小蛤奢,右子樹上的節(jié)點一定比根節(jié)點大帅刀,且它的左右子樹一定也為二叉搜索樹。

解題思路:

  1. 首先找到左子樹和右子樹的開始坐標(biāo)和結(jié)束坐標(biāo)远剩,得到左子數(shù)組和右子數(shù)組。
  2. 驗證左子數(shù)組中的元素是否都小于根節(jié)點骇窍,右子數(shù)組中的元素是否都大于根節(jié)點瓜晤。
  3. 若滿足條件,則進行遞歸驗證左子樹和右子樹是否都是二叉搜索樹(利用'或'門的短路性質(zhì)腹纳,子樹為空不進行判斷)痢掠。

給出兩種實現(xiàn)方法:

public boolean VerifySequenceOfBST(int[] sequence) {
    if (sequence.length == 0)
        return false;
    int len = sequence.length;
    int root = sequence[len-1];
    int leftBegin = 0, leftEnd = 0;

    // 找左子樹的開始坐標(biāo)和結(jié)束坐標(biāo)
    while (leftEnd < len-1) {
        if (sequence[leftEnd] > root)
            break;
        leftEnd++;
    }
    // 找右子樹的開始坐標(biāo)和結(jié)束坐標(biāo)
    int rightEnd = leftEnd, rightBegin = leftEnd;
    while (rightEnd < len-1) {
        if (sequence[rightEnd] < root)
            return false;
        rightEnd++;
    }
    // 得到子數(shù)組
    int[] leftArr = Arrays.copyOfRange(sequence, leftBegin, leftEnd);
    int[] rightArr = Arrays.copyOfRange(sequence, rightBegin, rightEnd);
    
    // 驗證左右子樹上的節(jié)點是否滿足二叉搜索樹的規(guī)則,不滿足直接返回false
    for (int num : leftArr)
        if (num > root) return false;
    for (int num : rightArr)
        if (num < root) return false;

    boolean left = leftArr.length == 0 || VerifySequenceOfBST(leftArr);
    boolean right = rightArr.length == 0 || VerifySequenceOfBST(rightArr);
    return left && right;
}
public boolean VerifySequenceOfBST(int[] sequence) {
    if (sequence.length == 0)
        return false;
    return VerifySequenceOfBST(sequence, 0, sequence.length-1);
}

public boolean VerifySequenceOfBST(int[] sequence, int left, int right) {
    // 當(dāng)子樹為空或子樹只有一個節(jié)點時嘲恍,直接返回true
    if (left >= right)
        return true;
    int i = right;
    // 找到右子樹的起點i
    while (i > left && sequence[i-1] > sequence[right])
        i--;
    // 從左子樹的終點開始足画,驗證左子樹是否小于根節(jié)點
    for (int j = i-1; j >= left; j--) {
        if (sequence[j] > sequence[right])
            return false;
    }
    return VerifySequenceOfBST(sequence, left, i-1) && VerifySequenceOfBST(sequence, i, right-1);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市佃牛,隨后出現(xiàn)的幾起案子淹辞,更是在濱河造成了極大的恐慌,老刑警劉巖俘侠,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件象缀,死亡現(xiàn)場離奇詭異蔬将,居然都是意外死亡,警方通過查閱死者的電腦和手機央星,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門霞怀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莉给,你說我怎么就攤上這事毙石。” “怎么了颓遏?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵徐矩,是天一觀的道長。 經(jīng)常有香客問我州泊,道長丧蘸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任遥皂,我火速辦了婚禮力喷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘演训。我一直安慰自己弟孟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布样悟。 她就那樣靜靜地躺著拂募,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窟她。 梳的紋絲不亂的頭發(fā)上陈症,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音震糖,去河邊找鬼录肯。 笑死,一個胖子當(dāng)著我的面吹牛吊说,可吹牛的內(nèi)容都是我干的论咏。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼颁井,長吁一口氣:“原來是場噩夢啊……” “哼厅贪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雅宾,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤养涮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體单寂,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡贬芥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宣决。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蘸劈。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尊沸,靈堂內(nèi)的尸體忽然破棺而出威沫,到底是詐尸還是另有隱情,我是刑警寧澤洼专,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布棒掠,位于F島的核電站,受9級特大地震影響屁商,放射性物質(zhì)發(fā)生泄漏烟很。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一蜡镶、第九天 我趴在偏房一處隱蔽的房頂上張望雾袱。 院中可真熱鬧,春花似錦官还、人聲如沸芹橡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽林说。三九已至,卻和暖如春屯伞,著一層夾襖步出監(jiān)牢的瞬間腿箩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工劣摇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留珠移,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓饵撑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親唆貌。 傳聞我的和親對象是個殘疾皇子滑潘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361