二叉搜索树的后序遍历序列——剑指offer33

题目描述
二叉搜索树的后序遍历序列——剑指offer33_第1张图片
法一)递归分治
解题思路
在这里插入图片描述
复杂度分析
在这里插入图片描述
代码如下

class Solution{
public:
    bool recur(vector<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 recur(postorder, i, m-1) && recur(postorder, m, j-1) && (p==j);  //注意是j-1
    }
    bool verifyPostorder(vector<int>& postorder){
        return recur(postorder, 0, postorder.size()-1);
    }
};

法二)单调栈
解题思路
二叉搜索树的后序遍历序列——剑指offer33_第2张图片
二叉搜索树的后序遍历序列——剑指offer33_第3张图片
二叉搜索树的后序遍历序列——剑指offer33_第4张图片
二叉搜索树的后序遍历序列——剑指offer33_第5张图片
二叉搜索树的后序遍历序列——剑指offer33_第6张图片
复杂度分析
在这里插入图片描述
代码如下

// class Solution {
// public:
//     bool verifyPostorder(vector& postorder) {
//         if(postorder.empty())return true;
//         stack stk;
//         int sign=INT_MAX;//全局单调记号,记录已出栈元素的最小值
//         for(int i=postorder.size()-1;i>-1;i--){
//             while(!stk.empty() && postorder[i]
//                 sign=stk.top();
//                 stk.pop();
//             }
//             stk.emplace(postorder[i]);
//             if(stk.top()>sign)return false;
// //存在元素大于出栈元素中的最小值,则中序遍历丧失单调性,返回false。
//         }
//         return true;
//     }
// };
class Solution {
public:
    bool verifyPostorder(vector<int>& postorder) {
        vector<int> sub;
        int root = INT_MAX;
        for (auto i = postorder.rbegin(); i < postorder.rend(); ++i) { // 后序的逆序遍历
            if (*i > root) return false;
            while (sub.size() && *i < sub.back()) // 切换遍历节点,清除上次遍历数据,出栈
                root = sub.back(), sub.pop_back();
            sub.push_back(*i); // 单调递增逻辑,压栈
        }
        return true;
    }
};

你可能感兴趣的:(算法刷题笔记,算法,数据结构,leetcode)