题目地址:
https://www.acwing.com/problem/content/description/44/
输入一个长 n n n的整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
数据范围:
数组长度
[
0
,
1000
]
[0,1000]
[0,1000]。
可以用DFS。首先最后一个数一定是树根,那么从左向右找第一个大于树根的位置,如果从该位置开始向后有小于树根的数,则说明不是BST,返回false。否则递归判断左右子树。代码如下:
#include <vector>
using namespace std;
class Solution {
public:
bool verifySequenceOfBST(vector<int> v) { return dfs(0, v.size() - 1, v); }
bool dfs(int l, int r, vector<int>& v) {
if (l >= r) return true;
int root = v[r], k = l;
while (k < r && v[k] < root) k++;
for (int i = k; i < r; i++)
if (v[i] < root) return false;
return dfs(l, k - 1, v) && dfs(k, r - 1, v);
}
};
平均时间复杂度 O ( n log n ) O(n\log n) O(nlogn),空间 O ( log n ) O(\log n) O(logn)。