题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
设计思想:
序列的最后一个元素一定是整棵树的根节点,从序列开头找第一个大于根节点值的元素p->val,该元素后边直到末尾前一个元素的元素值应该都大于p->val(若p到末尾之间还有元素,才满足后序遍历的二叉搜索树),[p,末尾节点)将是根节点的右子树。如果从到遍历到末尾也没找到大于根节点的元素,则根节点只有左子树没有右子树。想到这里,递归的设计思想就出来了
class Solution {
public:
bool VerifySquenceofBST_Par(vector<int>sequence,unsigned int start,unsigned int end)
{
int root=sequence[end];
int i;
for(i=0;i<end;++i)
if(sequence[i]>root)
break;
int j=i;
for(int k=j;k<end;++k)
if(sequence[k]<root)
return false;
bool left=true;
if (i>0)
left=VerifySquenceofBST_Par(sequence,0,i-1);
bool right=true;
if(j<end)
right=VerifySquenceofBST_Par(sequence,j,end-1);
return left&&right;
}
bool VerifySquenceOfBST(vector<int> sequence)
{
if(sequence.size()==0)
return false;
return VerifySquenceofBST_Par(sequence,0,sequence.size()-1);
}
};