九度oj 题目1367:二叉搜索树的后序遍历序列

题目描述:

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

输入:

每个测试案例包括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

参考其他人的博客:“
如果按照后序遍历,先左后右最后自己的顺序来遍历树,数组的最后一个元素肯定是自己(父节点),然后剩余的部分分成两个部分,第一部分都比自己小(左子树部分),
第二部分都比自己大(右子树部分),因此套用这个关系就可以循环检验出是否是二叉搜索树的后序遍历了。”
代码如下
 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <iostream>
 6 #define MAX 10002
 7 
 8 using namespace std;
 9 int num[MAX];
10 
11 bool isHou(int start, int end) {
12     if(end <= start) {
13         return true;
14     }
15     int state = 0;
16     bool isOk = true;
17     int fen = end;
18     int i = start;
19     while(i < end) {
20         if(num[i] > num[end]) {
21             fen = i;
22             break;
23         }
24         if(num[i] == num[end]) {
25             return false;
26         }
27         i++;
28     }
29     while(i < end) {
30         if(num[i] < num[end]) {
31             return false;
32         }
33         i++;
34     }
35     
36     return isHou(start, fen-1) && isHou(fen, end-1);
37 }
38 
39 int main(int argc, char const *argv[])
40 {
41     int n;
42     //freopen("input.txt","r",stdin);
43     while(scanf("%d",&n) != EOF) {
44         for(int i = 0; i < n; i++) {
45             scanf("%d",&num[i]);
46         }
47         if(isHou(0, n-1)) {
48             puts("Yes");
49         }
50         else {
51             puts("No");
52         }
53     }
54     return 0;
55 }
原文地址:https://www.cnblogs.com/jasonJie/p/5767590.html