• 二叉搜索树的后序遍历


    题目描述

    输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
     
    递归
     
    class Solution {
    public:
        bool VerifySquenceOfBST(vector<int> sequence) {
    		int size=sequence.size();
            if(0==size) {
                return false;
            }
            return isLastOrder(sequence,0,size-1);
        }
    private:
        bool isLastOrder(vector<int>& sequence,int b,int e) {
            if(b==e) {
                return true;
            }
            int mid=b;
            while(sequence[mid++]<sequence[e] && mid<e);
            
            int tmp=mid;
            while(sequence[tmp++]>sequence[e] && tmp<e);
            if(tmp<e) {
                return false;
            }
            if(mid==b || mid==e) {
                return isLastOrder(sequence,b,e-1);
            }
            else {
                return (isLastOrder(sequence,b,mid-1)&&isLastOrder(sequence,mid,e-1));
            }
        }
    };
    

      

    递归简化版本

    BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定义 : ) 。

    class Solution {
        bool judge(vector<int>& a, int l, int r){
            if(l >= r) return true;
            int i = r;
            while(i > l && a[i - 1] > a[r]) --i;
            for(int j = i - 1; j >= l; --j) if(a[j] > a[r]) return false;
            return judge(a, l, i - 1) && (judge(a, i, r - 1));
        }
    public:
        bool VerifySquenceOfBST(vector<int> a) {
            if(!a.size()) return false;
            return judge(a, 0, a.size() - 1);
        }
    };
    

      

    //非递归  
    //非递归也是一个基于递归的思想:
    //左子树一定比右子树小,因此去掉根后,数字分为left,right两部分,right部分的
    //最后一个数字是右子树的根他也比左子树所有值大,因此我们可以每次只看有子树是否符合条件
    //即可,即使到达了左子树左子树也可以看出由左右子树组成的树还想右子树那样处理
     
    //对于左子树回到了原问题,对于右子树,左子树的所有值都比右子树的根小可以暂时把他看出右子树的左子树
    //只需看看右子树的右子树是否符合要求即可
    class Solution {
    public:
        bool VerifySquenceOfBST(vector<int> sequence) {
            int size = sequence.size();
            if(0==size)return false;
     
            int i = 0;
            while(--size)
            {
                while(sequence[i++]<sequence[size]);
                while(sequence[i++]>sequence[size]);
     
                if(i<size)return false;
                i=0;
            }
            return true;
        }
    };
    

      

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    开始我的博客
    POJ 1284:Primitive Roots(素数原根的个数)
    数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)
    NYOJ 85:有趣的数(打表,规律)
    NYOJ 12:喷水装置(二)(贪心,区间覆盖问题)
    HDU 2058:The sum problem(数学)
    HDU 1716:排列2(全排列)
    HDU 2048:神、上帝以及老天爷(错排公式,递推)
    NYOJ 6:喷水装置(一)(贪心)
    BZOJ 2002:Bounce 弹飞绵羊(分块)
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7299926.html
Copyright © 2020-2023  润新知