问题A 折半查找的次数
题目描述
给你一个无重复数的有序序列,如果采用折半查找的方式,对于给定的数,需要比较几次找到,请编程实现。
输入
第一行是N,表示序列中数的个数,序列最长1000,第二行是一个有序序列,第三行是要找的数x。
输出
如果找到x,输出折半比较的次数,否则输出NO。
样例输入
11
5 13 19 21 37 56 64 75 80 88 92
19
样例输出
2
#include <iostream>
using namespace std;
int cnt;
int a[20005];
void search(int x,int a[],int n){
int l=1,r=n;
while(l<r){
int i=(r+l)/2;
if(x==a[i]) {
cnt++;
r=i;
break;
}
else if(x>a[i]){
l=i+1;
cnt++;
}
else {
r=i-1;
cnt++;
}
}
if(a[r]==x) cout<<cnt;
else cout<<"NO";
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int x;cin>>x;
search(x,a,n);
return 0;
}
问题B 二叉搜索树中的查找
题目描述
给你一个数据序列,请构造一个二叉搜索树,然后计算出找到给定数据需比较的次数。
输入
第一行是N,表示序列中数的个数,序列最长1000,第二行是一个数据序列,第三行是要找的数x。
输出
如果找到x,输出比较的次数,没找到则输出NO。
样例输入
5
1 2 3 5 4
5
样例输出
4
#include<bits/stdc++.h>
using namespace std;
struct node{
int val;
node *l;
node *r;
};
int ans=0;
int flag=0;
void insert(node * &p,int c){
if(p==NULL){
p=new node;
p->val=c;
p->l=NULL;
p->r=NULL;
}
if(c<p->val){
insert(p->l,c);
}
if(c>p->val){
insert(p->r,c);
}
}
void search(node *T,int x){
if(T){
ans++;
if(T->val==x){
flag=1;
cout<<ans;
}else if(x<T->val)
search(T->l,x)