题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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);
}
};