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

来源:互联网 发布:su素材知乎 编辑:程序博客网 时间:2024/06/05 09:15

题目描述

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

思路:

后续遍历的特点是遍历序列为下面这几种形式:
1. 根
2. 左右根
3. 左根
4. 右根
其中左表示左子树,右表示右子树,根表示根节点。由于是二叉搜索树,所以左子树的节点全都小于根节点,右子树全都大于根节点。而根节点肯定在最后。
我们可以通过递归的方式来处理。先寻找左子树,再寻找右子树。如果左子树和右子树都满足上述条件,则递归的处理左子树和右子树。否则返回否。递归出口为上面第一种情况,就是只有一个节点。同时要注意第三种情况和第四种情况。

class Solution {public:    bool VerifySquenceOfBST(vector<int> sequence) {            int length=sequence.size();            if(length == 0)                return false;            return VerifyCore(sequence,0,length-1);    }    bool VerifyCore(vector<int> sequence,int begin,int end)    {        if(begin == end)            return true;        int i=begin;        while(i< end && sequence[i]<sequence[end] )            ++i;        if(i==end)        {            return VerifyCore(sequence,begin,end-1);        }        else        {            int j=i+1;            while(j<end && sequence[j]>sequence[end])                ++j;            if(j<end)                return false;            else            {                if(i>begin)                    return (VerifyCore(sequence,begin,i-1) && VerifyCore(sequence,i,end-1));                else                     return VerifyCore(sequence,begin,end-1);            }        }    }};
0 0