04-树4. 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 1Sample Output:
YES NONO
还是理解题意,经人指点,这里的move all the way down应该是指下一个点挂在上一个点,也就是如果是2 4 1 3,那么4必为2左右儿子之一,1必为4左右儿子之一,3必为1左右儿子之一。也就是走单路。虽然这题有取巧方法,但是我没有用。还是老老实实的建立二叉树。比较有意的是。在这次自写过程中误将T->left = insert(T->left,k);写成了insert(T->left,k);由于传入的指针在函数中做的任何操作都不影响指针原来的地址值导致错误。引发了我的思考。而后我又写了一次。这次尝试穿了个二维指针进去。地址就被成功改写了。
1.用T->left = insert(T->left,k);的代码
2.用二维指针的代码:#include<stdio.h> #include<stdlib.h> typedef struct bst{ int data; struct bst* left; struct bst* right; }BST; BST* insert(BST* T,int k); int main(){ int m,n,i,j,t,p = 1,P; scanf("%d%d",&m,&n); for(i = 0;i<m;p = 1,i++){ BST *T1 =NULL; for(j = 0;j<n;j++){ scanf("%d",&t); if(!(T1 = insert(T1,t))) p = 0; } if(p) printf("YES\n"); else printf("NO\n"); } return 0; } BST* insert(BST* T,int k){ if(T == NULL){ T = (BST*)malloc(sizeof(struct bst)); T->data = k; T->left = T->right = NULL; return T; } // 单路进入 if(k<T->data&&T->right == NULL){ T->left = insert(T->left,k); if(T->left == NULL) return NULL; } // 单路进入 else if(k>T->data&&T->left == NULL){ T->right = insert(T->right,k); if(T->right == NULL) return NULL; } else return NULL; return T; }
#include<stdio.h> #include<stdlib.h> typedef struct bst{ int data; struct bst* left; struct bst* right; }*BST; int insert(BST* T,int k); int main(){ int m,n,i,j,t,p = 1,P; scanf("%d%d",&m,&n); for(i = 0;i<m;p = 1,i++){ BST T1 =NULL; for(j = 0;j<n;j++){ scanf("%d",&t); if(!insert(&T1,t)) p = 0; } if(p) printf("YES\n"); else printf("NO\n"); } return 0; } int insert(BST* T,int k){ if(*T == NULL){ *T = (BST)malloc(sizeof(struct bst)); (*T)->data = k; (*T)->left = (*T)->right = NULL; return 1; } if(k<(*T)->data&&(*T)->right == NULL){ if(!insert(&(*T)->left,k)) return 0; } else if(k>(*T)->data&&(*T)->left == NULL){ if(!insert(&(*T)->right,k)) return 0; } else return 0; return 1; }