根据后序数组重建搜索二叉树
题目描述
给定一个有 n 个不重复整数的数组 arr,判断 arr 是否可能是节点值类型为整数的搜索二叉树后序遍历的结果。
输入描述:
第一行一个整数 n,表示数组的长度。
第二行 n 个整数 arr_i。
输出描述:
如果是搜索二叉树后序遍历的结果则输出 “true”,否则输出 “false”。
示例1
输入
3
1 3 2
输出
true
备注:
1 ≤ n ≤ 5 ∗ 1 0 5 1 \leq n \leq 5*10^5 1≤n≤5∗105
− 1 0 6 ≤ a r r i ≤ 1 0 6 -10^6 \leq arr_i \leq 10^6 −106≤arri≤106
题解:
二叉搜索树的后序遍历根节点一定在后序数组末尾,假设后序数组为 arr ,有 n 个元素,第一个比 arr[n - 1] 大的元素位置为 m ,则 arr[0,…,m-1] < arr[n - 1]、arr[m,…,n-1] > arr[n - 1],按照这个规律递归进行判断即可。
代码:
#include <cstdio>
using namespace std;
const int N = 500010;
int n, a[N];
bool dfs(int s, int e) {
if (s >= e) return true;
int i = s;
for (; i < e; ++i) if (a[i] > a[e]) break;
for (int k = i; k < e; ++k) if (a[k] < a[e]) return false;
return dfs(s, i - 1) && dfs(i, e - 1);
}
int main(void) {
scanf("%d", &n);
for (int i = 0; i < n; ++i) scanf("%d", a + i);
puts(dfs(0, n - 1) ? "true" : "false");
return 0;
}