04-树7. Search in a Binary Search Tree (25)
To search a key in a binary search tree, we start from the root and move all the way down, choosing branches according to the comparison results of the keys. The searching path corresponds to a sequence of keys. For example, following {1, 4, 2, 3} we can find
3 from a binary search tree with 1 as its root. But {2, 4, 1, 3} is not such a path since 1 is in the right subtree of the root 2, which breaks the rule for a binary search tree. Now given a sequence of keys, you are supposed to tell whether or not it indeed
correspnds to a searching path in a binary search tree.
Input Specification:
Each input file contains one test case. For each case, the first line gives two positive integers N and M (<=100) which are the total number of sequences, and the size of each sequence, respectively. Then N lines follow, each gives a sequence of keys. It is
assumed that the keys are numbered from 1 to M.
Output Specification:
For each sequence, print in a line "YES" if the sequence does correspnd to a searching path in a binary search tree, or "NO" if not.
Sample Input:
3 4
1 4 2 3
2 4 1 3
3 2 4 1
Sample Output:
YES
NO
NO
#include <stdio.h>
//搜索树要求路径中任一元素的右边全部元素都要同一时候大于它或小于它;
//直接遍历每一个元素,比較右边元素大小关系。时间复杂度为O(n^2)。超时;
//O(n)方法:从路径尾部開始,分别维护两个变量:当前尾部元素的最大值和最小值。 int judgePath(int *path, int n) {
int min = path[n - 1], max = path[n - 1];
for (int i = n - 2; i >= 0; --i) {
if (path[i] > max) //假设当前元素比最大值还大。说明后面的路径是当前元素的左子树。可行
max = path[i]; //更新最大值
else if (path[i] < min)
min = path[i];
else //当前元素介于最大值与最小值之间。不可行
return 0;
}
return 1;
}
int main() {
// freopen("test.txt", "r", stdin);
int n, m;
scanf("%d%d", &n, &m);
while (n--) { //n个測试用例
int path[100] = {};
for (int i = 0; i < m; ++i) {
scanf("%d", &path[i]);
}
if (judgePath(path, m))
printf("YES\n");
else
printf("NO\n");
} return 0;
}