剑指offer---二叉搜索树的后序遍历序列

来源:互联网 发布:centos怎么修改语言 编辑:程序博客网 时间:2024/06/05 18:09

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解析:
递归:数组最后一个元素是根节点,从第一个元素开始向后遍历直到找到第一个大于根节点值的元素,设该位置为i,从该元素到根节点的前一个元素(i:end-1),若都大于根节点返回true,同样方法递归数组(i:end-1)和数组(begin:i-1),若都返回true,则该数组为二叉搜索树的后序遍历序列。
代码:
class Solution {public:    bool VerifySquenceOfBST(vector<int> sequence) {        return bst(sequence,0,sequence.size()-1);    }    bool bst(vector<int> sequence,int begin,int end){        if(sequence.size()==0||begin>end)            return false;        int root=sequence[end];        int i=begin;        for(;i<end;i++){            if(sequence[i]>root)                break;        }        for(int j=i;j<end;j++){            if(sequence[j]<root)                return false;        }        bool left=true;        if(i>begin)            left=bst(sequence,begin,i-1);        bool right=true;        if(i<end)            right=bst(sequence,i,end-1);        return left&&right;    }};

非递归:
基于递归的思想:
//左子树一定比右子树小,因此去掉根后,数字分为left,right两部分,right部分的
//最后一个数字是右子树的根他也比左子树所有值大,因此我们可以每次只看右子树是否符合条件
//即可,即使到达了左子树左子树也可以看出由左右子树组成的树还像右子树那样处理
 
//对于左子树回到了原问题,对于右子树,左子树的所有值都比右子树的根小可以暂时把他看出右子树的左子树,只需看看右子树的右子树是否符合要求即可

例如:对于后序遍历序列18,28,32,30,20,38,40,37,36(0:8),长度为9.该树的根节点为36(i=8),左子树(0:4),右子树(5:7),第一次判断,
只需从左到右遍历数组0:8,前部分都小于最后一个数且后部分都大于最后一个数,则继续遍历数组0:7进行判断,若都是前部分都小于最后一个数且后部分
都大于最后一个数,则该数组为二叉搜索树的后序遍历序列。

代码:
bool VerifySquenceOfBST(vector<int> sequence) {//非递归        if(sequence.size()==0)            return false;        int size=sequence.size();        int i=0;        while(--size){            while(sequence[i++]<sequence[size]);            while(sequence[i++]>sequence[size]);            if(i<size)                return false;            i=0;        }        return true;    }