以根为结点调用find,从根向叶搜索结点。如果给定键值小于当前结点x的键值,那么搜索目标移动至左子结点继续搜索,反之移动至右子节点,键值不存在时返回NIL
node *find(node *u,int k)
{
while(u!=NIL&&k!=u->key){
if(k<u->key){
u=u->left;
}else{
u=u->right;
}
}
return u;
}
#include<iostream>
#include<cstdio>
#include<string>
#include<cstdlib>
using namespace std;
struct node{
int key;
node *right,*left,*parent;
};
node *root,*NIL;
void insert(int k)
{
node *y=NIL;
node *x=root;
node *z;
z=(node*)malloc(sizeof(node));
z->key=k;
z->left=NULL;
z->right=NULL;
while(x!=NULL){
y=x;
if(z->key<x->key){
x=x->left;
}else{
x=x->right;
}
}
z->parent=y;
if(y==NIL){
root=z;
}else{
if(z->key<y->key){
y->left=z;
}else{
y->right=z;
}
}
}
void inorder(node *u)
{
if(u==NULL){
return ;
}
inorder(u->left);
printf(" %d",u->key);
inorder(u->right);
}
void preorder(node *u)
{
if(u==NULL){
return ;
}
printf(" %d",u->key);
preorder(u->left);
preorder(u->right);
}
node *find(node *u,int k)
{
while(u!=NIL&&k!=u->key){
if(k<u->key){
u=u->left;
}else{
u=u->right;
}
}
return u;
}
int main()
{
int n,k;
string com;
scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>com;
if(com=="insert"){
scanf("%d",&k);
insert(k);
}else if(com=="print"){
inorder(root);
printf("\n");
preorder(root);
printf("\n");
}else{
scanf("%d",&k);
node *t=find(root,k);
if(t!=NULL){
printf("yes\n");
}else{
printf("no\n");
}
}
}
return 0;
}
/*
10
insert 30
insert 88
insert 12
insert 1
insert 20
insert 17
insert 25
find 16
print
*/