1. 程式人生 > 實用技巧 >【LeetCode-樹】二叉搜尋樹的後序遍歷序列

【LeetCode-樹】二叉搜尋樹的後序遍歷序列

題目描述

輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷結果。如果是則返回 true,否則返回 false。假設輸入的陣列的任意兩個數字都互不相同。
示例:

輸入: [1,6,3,2,5]
輸出: false

輸入: [1,3,2,6,5]
輸出: true

說明:

  • 陣列長度 <= 1000

題目連結: https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/

思路

二叉搜尋樹的後序遍歷序列的最後一個節點是根節點,除去最後一個節點,序列可以分為兩個連續的部分:一部分小於根節點的值(左子樹),另一部分大於根節點的值(右子樹)。所以,我們根據根節點判斷第一段序列是不是全都小於根節點的值,第二段序列是不是全都大於根節點的值。如果是的話,遞迴判斷兩段序列;否則,返回 false。

程式碼如下:

class Solution {
public:
    bool verifyPostorder(vector<int>& postorder) {
        return doVerify(postorder, 0, postorder.size()-1);
    }

    bool doVerify(vector<int>& postorder, int left, int right){
        if(left>=right) return true;

        int i = left;
        while(postorder[i]<postorder[right]) i++;
        i--;  // 別忘了 i--

        int j = i+1;
        while(postorder[j]>postorder[right]) j++;

        if(j!=right) return false;
        return doVerify(postorder, left, i) && doVerify(postorder, i+1, right-1);
    }
};