1. 題目
給定一個整數數組,你須要驗證它是不是一個二叉搜索樹正確的先序遍歷序列。數組
你能夠假定該序列中的數都是不相同的。網絡
參考如下這顆二叉搜索樹: 5 / \ 2 6 / \ 1 3 示例 1: 輸入: [5,2,6,1,3] 輸出: false 示例 2: 輸入: [5,2,1,3,6] 輸出: true 進階挑戰: 您可否使用恆定的空間複雜度來完成此題?
來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/verify-preorder-sequence-in-binary-search-tree
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。
學習
2. 解題
2.1 遞歸超時解
- 檢查左邊小於root,右邊是否都大於root,時間複雜度O(n2)
class Solution { public: bool verifyPreorder(vector<int>& preorder) { if(preorder.size() <= 2) return true; return check(preorder, preorder[0], 1, preorder.size()-1); } bool check(vector<int>& arr, int root, int l, int r) { if(l>=r) return true; int split = l, i; while(split <= r && arr[split] < root) split++;//左邊部分比我root小 i = split; for(i = split; i <= r; ++i) if(arr[i] < root)//右邊部分因該都比我大,此處複雜度較高 return false; return check(arr, arr[l], l+1, split-1) && (split > r ||check(arr, arr[split], split+1, r)); } };
2.2 單調棧
class Solution { map<int,int> m; public: bool verifyPreorder(vector<int>& preorder) { if(preorder.size() <= 2) return true; int MIN = INT_MIN; stack<int> s; for(int i = 0; i < preorder.size(); ++i) { if(preorder[i] < MIN) return false; while(!s.empty() && s.top() < preorder[i])//遇到大的了,右分支 { MIN = s.top();//記錄彈棧的棧頂爲最小值 s.pop(); } s.push(preorder[i]); } return true; } };
100 ms 21.5 MBurl
個人CSDN博客地址 https://michael.blog.csdn.net/spa
長按或掃碼關注個人公衆號(Michael阿明),一塊兒加油、一塊兒學習進步!
.net