• 二叉搜索树的后序遍历


    题目描述

    输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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;
        }
    };
    

      

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    题目1441:人见人爱 A ^ B(二分求幂)
    题目1003:A+B(按逗号分隔的A+B)
    题目1002:Grading(题目背景基于高考打分的简单判断)
    题目1104:整除问题(还是求素数)
    题目1040:Prime Number(第k个素数)
    题目1440:Goldbach's Conjecture(哥达巴赫猜想)
    题目1438:最小公倍数(利用最大公倍数求解)
    题目1439:Least Common Multiple(求m个正数的最小公倍数lcm)
    题目1080:进制转换(任意进制直接转换方法)
    题目1083:特殊乘法(求模运算符的使用)
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7299926.html
Copyright © 2020-2023  润新知