题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
测试用例1:vector<int> v1 = { 5, 7, 6, 9, 11, 10, 8 };
结果:true;
测试用例2:vector<int> v1 = {7,4,6,5};
结果:false;
解法思路一;暴力破解(不推荐,)
解法思路二:后续遍历中的最后一个数永远将数组分为两部分,前面全部小于根节点,后面全部大于根节点。
代码:
#pragma once
/*输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。*/
#include<iostream>
#include<vector>
using namespace std;
/**
**vector<int> v1 = { 5, 7, 6, 9, 11, 10, 8 };
**第一趟:取出的比较数值为:8.数组划分成:[5, 7, 6] 8 [ 9, 11, 10]
**第二趟:取出的比较数值为:10.数组划分成:[5, 7, 6, 9] 10 [11]
**第三趟:取出的比较数值为:11.数组划分成:[5, 7, 6, 9] 11 []
**第四趟:取出的比较数值为:9.数组划分成:[5, 7, 6] 9 []
**第五趟:取出的比较数值为:8.数组划分成:[5] 6 [7]
.........
*/
static class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int size = sequence.size();
if (0 == size)return false;
int i = 0;
while (--size)
{
while (sequence[i++]<sequence[size]);//后续遍历中的最后一个数永远将数组分为两部分,前面全部小于根节点,后面全部大于根节点。
while (sequence[i++]>sequence[size]);
if (i < size)return false;
i = 0;
}
return true;
}
};
测试:
#if 1
int main()
{
//vector<int> v1 = { 5, 7, 6, 9, 11, 10, 8 };
vector<int> v1 = {7,4,6,5};
Solution s;
bool ret=s.VerifySquenceOfBST(v1);
}
#endif//判断后续遍历的正确性