zoukankan      html  css  js  c++  java
  • 【剑指offer23 二叉搜索树的后序遍历序列】

    题目描述

    输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
     
    二叉搜索树,中序遍历的最后一个元素是中间值,找到前一半比它小的,后一半比他大。
    如果不满足一半小一半大,就false
    满足就递归左右部分
     
    class Solution {
    public:
        
        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));
        }
        
        bool VerifySquenceOfBST(vector<int> sequence) {
            if(!sequence.size()) return false;
            return judge(sequence, 0, sequence.size() - 1);
            
            
            
            /* CLion能过 但是 这上面过不了
            //return false;
            if(sequence.empty())return false;
            int len = sequence.size();
            if(len<=2)return true;
            
            int tou = sequence[len-1]; // 此时二叉树的头
            int flag = 0; //在某个位置前面 都应该比tou小  后面的都比头大
            int flag_i ;
            for(int i=0 ; i<len-1 ; ++i){
                if(sequence[i]<tou)flag_i=i;//会到最后一个比tou小的地方
                if(sequence[i]>tou)flag=1;//只要出现了比头大的  后面就应该都要大
                if(flag == 1 && sequence[i]<tou)return false;//后面出现比头小的了
            }
            vector<int> sequence_front , sequence_back;
            for(int i=0 ; i <=flag_i ; ++i)sequence_front.push_back(sequence[i]);
            for(int i=flag_i+1 ; i <len-1 ; ++i)sequence_back.push_back(sequence[i]);
            return VerifySquenceOfBST(sequence_front) && VerifySquenceOfBST(sequence_back);
            */
        }
    };
  • 相关阅读:
    shell 脚本编程学习
    LMH6505 vs AD8336
    ubuntu 8.04 NFS服务的配置(转)
    新博客开张了!
    基于ARMlinux环境下的音频系统开发
    可恶的英语考试
    转HashTable(C#)
    我的手机3300
    高效注册DLL控件 让你的IE浏览器复活
    学习.NET2.0随笔
  • 原文地址:https://www.cnblogs.com/Stephen-Jixing/p/13129475.html
Copyright © 2011-2022 走看看