-
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
时间限制:1 秒
内存限制:32 兆
题目描述:
- 输入:
-
每个测试案例包括2行:
第一行为1个整数n(1<=n<=10000),表示数组的长度。
第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]。
- 输出:
-
对应每个测试案例,如果输入数组是某二叉搜索树的后序遍历的结果输出Yes,否则输出No。
- 样例输入:
-
7
-
5 7 6 9 11 10 8
-
4
-
7 4 6 5
- 样例输出:
-
Yes
-
No
-
-
分析:根据后序遍历可以找到根节点,由根节点可以区分左子树和右子树
-
#include <iostream> #include <cstdio> using namespace std; struct TreeNode { int val; int left, right; }; const int N = 10001; TreeNode node[N]; bool createTree(int start, int end) { if (start >= end) return true; int val = node[end].val; int i = start; while (i < end && node[i].val < val) ++i; int index = i; while (i < end) { if (node[i].val < val) return false; ++i; } return createTree(start, index - 1) && createTree(index, end - 1); } int main(void) { int n; while (scanf("%d", &n) != EOF) { for (int i = 1; i <= n; ++i) { scanf("%d", &node[i].val); node[i].left = node[i].right = 0; } if (createTree(1, n)) printf("Yes\n"); else printf("No\n"); } return 0; }