剑指offer面试题33二叉搜索树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

设计思想:

序列的最后一个元素一定是整棵树的根节点,从序列开头找第一个大于根节点值的元素p->val,该元素后边直到末尾前一个元素的元素值应该都大于p->val(若p到末尾之间还有元素,才满足后序遍历的二叉搜索树),[p,末尾节点)将是根节点的右子树。如果从到遍历到末尾也没找到大于根节点的元素,则根节点只有左子树没有右子树。想到这里,递归的设计思想就出来了

class Solution {
public:
    bool VerifySquenceOfBST_Array(int Array[],int length)
    {
        
         int FirstOfDaYu=0;
        int i=0;
        for(;i<length-1;++i)
        {
            if(Array[i]>Array[length-1])
            {
                FirstOfDaYu=i;
                break;
            }
         }
        
        for(int j=i;j<length-1;++j)
        {
            if(Array[j]<Array[length-1])
                return false;
        }
      
        bool left=true;bool right=true;
        if(FirstOfDaYu>0)
        {
          left= VerifySquenceOfBST_Array(Array,FirstOfDaYu);
        }
         
        if(FirstOfDaYu<length-1)
        {
            right=VerifySquenceOfBST_Array(Array+FirstOfDaYu,length-FirstOfDaYu-1);
         }
        
        return left&&right;
    }

       
    bool VerifySquenceOfBST(vector<int> sequence)
    {
        
         int length=sequence.size();
        if(length==0)
            return false;
        
        if(length==1)
            return true;
        int tempArray[length];
        for(int i=0;i<length;++i)
        {
            tempArray[i]=sequence[i];
        }
    
        return VerifySquenceOfBST_Array(tempArray,length);
    }
    
};

猜你喜欢

转载自blog.csdn.net/qq_34793133/article/details/81118532