04-树7. Search in a Binary Search Tree (25)
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
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
提交代码
法一:
如果是二叉查找树,树上除了叶结点,每个节点的左右子树必有一棵空,另一棵不空。
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<queue> 6 #include<vector> 7 using namespace std; 8 struct node{ 9 int v; 10 node *l,*r; 11 node(){ 12 l=r=NULL; 13 } 14 }; 15 int main(){ 16 //freopen("D:\\INPUT.txt","r",stdin); 17 int n,m; 18 scanf("%d %d",&n,&m); 19 while(n--){ 20 queue<int> q; 21 int i,num; 22 node *p,*pp,*h=NULL; 23 for(i=0;i<m;i++){ 24 scanf("%d",&num); 25 q.push(num); 26 } 27 h=new node(); 28 h->v=q.front(); 29 q.pop(); 30 for(i=1;i<m;i++){ 31 num=q.front(); 32 q.pop(); 33 p=h; 34 while(p){ 35 pp=p;//pp point to the father of p 36 if(num>p->v&&p->l==NULL){ 37 p=p->r; 38 } 39 else{ 40 if(num<p->v&&p->r==NULL){ 41 p=p->l; 42 } 43 else 44 break;//防止元素相等 45 } 46 } 47 if(p==NULL){ 48 p=new node(); 49 p->v=num; 50 if(num>pp->v){ 51 pp->r=p; 52 } 53 else{ 54 pp->l=p; 55 } 56 } 57 else{ 58 break; 59 } 60 } 61 if(i==m){ 62 printf("YES\n"); 63 } 64 else{ 65 printf("NO\n"); 66 } 67 } 68 return 0; 69 }
法二:
先按题意建树,得到树后,用最后输入的数进行树的遍历,如果最后经过m次找到匹配的叶结点,说明序列正确;否则,序列错误。
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<queue> 6 #include<vector> 7 using namespace std; 8 struct node{ 9 int v; 10 node *l,*r; 11 node(){ 12 l=r=NULL; 13 } 14 }; 15 int main(){ 16 //freopen("D:\\INPUT.txt","r",stdin); 17 int n,m; 18 scanf("%d %d",&n,&m); 19 while(n--){ 20 queue<int> q; 21 int i,num,wantfind; 22 node *p,*pp,*h; 23 for(i=0;i<m;i++){ 24 scanf("%d",&num); 25 q.push(num); 26 } 27 wantfind=num; //最后一个 28 h=new node(); 29 h->v=q.front(); 30 q.pop(); 31 for(i=1;i<m;i++){ //建树 32 num=q.front(); 33 q.pop(); 34 p=h; 35 while(p){ 36 pp=p;//pp point to the father of p 37 if(num>p->v){ 38 p=p->r; 39 } 40 else{ 41 p=p->l; 42 } 43 } 44 p=new node(); 45 p->v=num; 46 if(num>pp->v){ 47 pp->r=p; 48 } 49 else{ 50 pp->l=p; 51 } 52 } 53 int count=0; 54 p=h; 55 while(p){ 56 if(wantfind>p->v){ 57 p=p->r; 58 } 59 else{ 60 p=p->l; 61 } 62 count++; 63 } 64 if(count==m){ 65 printf("YES\n"); 66 } 67 else{ 68 printf("NO\n"); 69 } 70 } 71 return 0; 72 }