时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 热度指数:639348
本题知识点: 栈 树
算法知识视频讲解
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
一、O(n^2)
特点:遍历的时候,如果遇到比最后一个元素大的节点,就说明它的前面都比最后一个元素小,该元素后面的所有值都必须大于最后一个值,这两个条件必须都要满足。否则就说明该序列不是二叉树后序遍历。
例子: 2 4 3 6 8 7 5 这是一个正确的后序遍历
这个例子的特点就是:最后一个元素是 5 ,首先遍历数组,当遍历到6的时候,6前面的值都小于5,如果在6后面的值有一个小于5就不是后序遍历,所以一旦在遍历的时候遇到比最后一个元素的值索引,那么之后的所有元素都必须大于5,否则就不是后序遍历序列。
链接:https://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90e447bafd?answerType=1&f=discussion
来源:牛客网
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size()==0){
return false;
}
int sum = sequence.size()-1;
int count = 0;
while(sum){
while(sequence[count] < sequence[sum]){
++count;
}
while(sequence[count] > sequence[sum]){
++count;
}
if(count < sum){
return false;
}
--sum;
count = 0;
}
return true;
}
二、O(n logn)
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.empty())
{
return false;
}
//记录根节点
int root = sequence[end];
//寻找左树
int index = 0;
for(; index < end; index++)
{
if(sequence[index] > root)
{
break;
}
}
int etree = index;
//寻找右树
for(; etree < end; etree++)
{
if(sequence[etree] < root)
{
return false;
}
}
bool left = true;
if(index > begin)
left = bst(sequence, begin, index - 1);
// 判断右子树是不是二叉搜索树
bool right = true;
if(index < end - 1)
right = bst(sequence, index , end - 1);
return left && right;
}
};