[劍指 offer]--二叉樹--面試題33. 二叉搜索樹的後序遍歷序列

1 題目描述

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

參考以下這顆二叉搜索樹:

 5
/ \

2 6
/
1 3
示例 1:

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

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

提示:

數組長度 <= 1000

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2 解題思路

後序遍歷定義: [ 左子樹 | 右子樹 | 根節點 ] ,即遍歷順序爲 “左、右、根” 。 二叉搜索樹定義: 左子樹中所有節點的值 <
根節點的值;右子樹中所有節點的值 > 根節點的值;其左、右子樹也分別爲二叉搜索樹。
在這裏插入圖片描述

  • 方法一:遞歸分治
    根據二叉搜索樹的定義,可以通過遞歸,判斷所有子樹的 正確性 (即其後序遍歷是否滿足二叉搜索樹的定義) ,若所有子樹都正確,則此序列爲二叉搜索樹的後序遍歷。

在這裏插入圖片描述

  • 複雜度分析:

時間複雜度 O(N2 ) : 每次調用 recur(i,j) 減去一個根節點,因此遞歸佔用 O(N) ;最差情況下(即當樹退化爲鏈表),每輪遞歸都需遍歷樹所有節點,佔用 O(N) 。
空間複雜度 O(N) : 最差情況下(即當樹退化爲鏈表),遞歸深度將達到 N 。

作者:jyd
鏈接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/solution/mian-shi-ti-33-er-cha-sou-suo-shu-de-hou-xu-bian-6/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

3 解決代碼

  • 方法一:遞歸分治《Java代碼》
class Solution {
    public boolean verifyPostorder(int[] postorder) {
        return recur(postorder, 0, postorder.length - 1);
    }
    boolean recur(int[] postorder, int i, int j) {
        if(i >= j) return true;
        int p = i;
        while(postorder[p] < postorder[j]) p++;
        int m = p;
        while(postorder[p] > postorder[j]) p++;
        return p == j && recur(postorder, i, m - 1) && recur(postorder, m, j - 1);
    }
}
  • 方法一:遞歸分治《python3代碼》
class Solution:
    def verifyPostorder(self, postorder: [int]) -> bool:
        def recur(i, j):
            if i >= j: return True
            p = i
            while postorder[p] < postorder[j]: p += 1
            m = p
            while postorder[p] > postorder[j]: p += 1
            return p == j and recur(i, m - 1) and recur(m, j - 1)

        return recur(0, len(postorder) - 1)

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