【LeetCode & 剑指offer刷题】树题15:33 判断某序列是否为二叉搜索树的后序序列...

【LeetCode & 剑指offer刷题】树题15:33 判断某序列是否为二叉搜索树的后序序列

【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

33 判断某序列是否为二叉搜索树的后序序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。 假设输入的数组的任意两个数字都互不相同。
 
/*
后序遍历序列规律:最后一个元素为根结点,前面左半部分为左子树,右半部分为右子树
BST规律:对任意结点,左结点<根结点<右结点的
根据这两个规律进行判断
*/
class Solution
{
public :
    bool VerifySquenceOfBST ( vector < int >& sequence )
    {
        if ( sequence . empty ()) return false ;
       
        return verify ( sequence , 0 , sequence . size ()- 1 );
    }
private :
    bool verify ( vector < int >& a , int begin , int end )
    {
        if ( begin >= end ) return true ; //只有一个元素了,其没有左右子树,没有判断的必要,故返回true
       
        int root = a[end]; //根结点的值
        //计算左子树序列的长度(左子树中结点值均小于根结点值)
        int i = begin ;
        for (; i < end - 1 ; i ++) //注意这里最多扫描到倒数第二个元素(最后一个元素为根结点)
        {
            if(a[i] > root) break; //一旦大于根结点就退出
        } //退出时,i即为左子树序列的长度
       
        //判断右子树序列是否满足大于根结点的规律
        for ( int j = i ; j < end - 1 ; j ++)
        {
            if(a[j] < root) return false; //若右子树不满足规律,则返回false
        }
       
        //判断左子树和右子树是否为二叉搜索树
        return verify ( a , begin , i - 1 ) && verify ( a , i , end - 1 );
       
    }
};
 
相关题目:判断某序列是否为二叉搜索树的前序遍历结果
举一反三:如果要求处理一颗二叉树的遍历序列, 可以先找到二叉树的根结点,再基于根结点把整棵树的遍历序列拆分成左子树对应的子序列和右子树对应的子序列,接下来再递归地处理这两个子序列,如问题“ 重建二叉树
 
 

 

posted @ 2019-01-05 19:49 wikiwen 阅读( ...) 评论( ...) 编辑 收藏
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值