04-树4. Search in a Binary Search Tree

04-树4. 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

还是理解题意,经人指点,这里的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);的代码

#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;
}
2.用二维指针的代码:

#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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值