[九度][何海涛] 二叉搜索树的后序遍历序列
- 题目描述:
-
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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
由于BST的左半部分都小于根,右半部分都大于根,我们可以根据这条性质来判断。后续遍历的最后一个是根,所以先找出根,然后找出右半部分就是连续大于根的部分,然后再去判断左半部分有大于根的元素肯定就不符合了。然后递归判断左子树和右子树。
P.S. 如果给的是一棵中序遍历的BST呢?可能的解答就是先枚举根的位置枚举的同时判断左半部分和右半部分时候是否符合BST的性质。1 #include <iostream> 2 using namespace std; 3 4 bool check(int a[], int beg, int end) 5 { 6 if (beg > end) 7 return true; 8 9 int root = a[end]; 10 11 int mid = end - 1; 12 13 while(mid >= beg) 14 { 15 if (a[mid] > root) 16 mid--; 17 else 18 break; 19 } 20 21 for(int i = beg; i <= mid; i++) 22 if (a[i] > root) 23 return false; 24 25 bool left = check(a, beg, mid); 26 bool right = check(a, mid + 1, end - 1); 27 28 return left && right; 29 } 30 31 int main() 32 { 33 int n; 34 int a[10000]; 35 36 while(cin >> n) 37 { 38 for(int i = 0; i < n; i++) 39 cin >> a[i]; 40 41 if (check(a, 0, n - 1)) 42 cout << "Yes" << endl; 43 else 44 cout << "No" << endl; 45 } 46 }