• 剑指 Offer 33. 二叉搜索树的后序遍历序列


    题目

    剑指 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)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    一张一驰,文武之道
    关于“未能加载……”和“web.config”
    DotText学习心得_1
    windows服务与事务
    AWR报告生成
    Java EE启示录
    跨入安全的殿堂读《Web入侵安全测试与对策》感悟
    用VS2005写Loadrunner测试脚本
    List of Free Programming books
    硬盘基础知多少
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13501016.html
Copyright © 2020-2023  润新知