劍指 Offer 33. 二叉搜尋樹的後序遍歷序列 - 8月8日
阿新 • • 發佈:2020-08-14
題目
劍指 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) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。