1. 程式人生 > 實用技巧 >劍指 Offer 33. 二叉搜尋樹的後序遍歷序列 - 8月8日

劍指 Offer 33. 二叉搜尋樹的後序遍歷序列 - 8月8日

題目

劍指 Offer 33. 二叉搜尋樹的後序遍歷序列

我的思路

在二叉搜尋樹中後序遍歷的特點是,最後一個數組元素對應的節點是樹的根,同時可以把除最後一個元素以外前面的節點分成兩段,一段都大於根,一段都小於根。遞迴檢查這個特點

我的實現

class Solution {
public:
    bool result = true;
    void check(int left,int end,vector<int>& postorder){
        if(left>=end-1){
            return;
        }else{
            
int pos = left; int m; while(postorder[pos]<postorder[end]){ pos++; } m = pos; while(postorder[pos]>postorder[end]){ pos++; } if(pos!=end){ result =false; }
else{ check(left,m-1,postorder); check(m,end-1,postorder); } } } bool verifyPostorder(vector<int>& postorder) { check(0,postorder.size()-1,postorder); return result; } }; /* 在二叉搜尋樹中後序遍歷的特點是,最後一個數組元素對應的節點是樹的根,同時可以把除最後一個元素以外前面的節點分成兩段,一段都大於根,一段都小於根。遞迴檢查這個特點
*/

時間複雜度最壞情況是n^2。

空間複雜度最壞情況是n,遞迴深度

拓展學習

官方題解的法二也不錯,藉助輔助空間時的複雜度降到了n。

利用了後序遍歷的倒序是前序遍歷的對稱,所以當前元素若比前一個元素val大,那麼當前元素一定是前一個元素對應節點的右孩子,如果比前一個元素小,那麼一定是某個節點的左孩子,該雙親節點是比當前節點val大的val最小的節點。可以通過輔助空間棧儲存這些潛在的雙親節點,因為如果當前節點之後的節點一定小於它對應的雙親節點

class Solution:
    def verifyPostorder(self, postorder: [int]) -> bool:
        stack, root = [], float("+inf")
        for i in range(len(postorder) - 1, -1, -1):
            if postorder[i] > root: return False
            while(stack and postorder[i] < stack[-1]):
                root = stack.pop()
            stack.append(postorder[i])
        return True

作者: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)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。