时间限制:1秒 空间限制:32768K 热度指数:166329
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
题解:
验证是否为二叉搜索树后续遍历,根据后序遍历的性质:根节点在序列最后,然后根据二叉搜索树的性质,左子树的值小于根节点,右节点的值大于根节点;再验证他的左子树,右子树,直到叶节点;
递归解法:感觉用的比较普遍(纯手打,不是粘贴代码,可能没注意单词的拼写,勿喷)
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size()==0)return false; //日常判断是否为空
return judge(sequence,0,sequence.size()-1);
}
bool judge(vector<int>sequence,int start,int len){
if(start>=len) //为叶节点
return true;
int i=len-1;
while(i>start&&sequence[i]>sequence[len])
i--;
for(int j=start;j<i;j++)
if(sequence[j]>sequence[len])
return false;
return judge(sequence,start,i)&&judge(sequence,i+1,len-1);
}
};
非递归:别人能想到这么写,真是厉害,是真的简便
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int size = sequence.size();
if(0==size)return false;
while(--size)
{
int i = 0;
while(sequence[i++]<sequence[size]);
while(sequence[i++]>sequence[size]);
if(i<size)return false;
}
return true;
}
};