Problem:
Binary Search Tree II

Write a program which performs the following operations to a binary search tree $T$ by adding the find operation to A: Binary Search Tree I.

insert $k$: Insert a node containing $k$ as key into $T$.

find $k$: Report whether $T$ has a node containing $k$.

print: Print the keys of the binary search tree by inorder tree walk and preorder tree walk respectively.

Input

In the first line, the number of operations $m$ is given. In the following $m$ lines, operations represented by insert $k$, find $k$ or print are given.

Output

For each find $k$ operation, print "yes" if $T$ has a node containing $k$, "no" if not.

In addition, for each print operation, print a list of keys obtained by inorder tree walk and preorder tree walk in a line respectively. Put a space character before each key.

Constraints

The number of operations $\leq 500,000$

The number of print operations $\leq 10$.

$-2,000,000,000 \leq key \leq 2,000,000,000$

The height of the binary tree does not exceed 100 if you employ the above pseudo code.

The keys in the binary search tree are all different.

Sample Input 1

10
insert 30
insert 88
insert 12
insert 1
insert 20
find 12
insert 17
insert 25
find 16
print

Sample Output 1

yes
no
1 12 17 20 25 30 88
30 12 1 20 17 25 88

Reference

Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. The MIT Press.

Solution in C (judge verdict: Accepted)

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
    int root;
    struct Node* parent;
    struct Node* leftchild;
    struct Node* rightchild;
}Node;
Node* insertTree(Node* Tree, int data)
{
    Node* y = NULL;
    Node* x = Tree;
    Node* temp = (Node*)malloc(sizeof(Node));
    temp->root = data;
    temp->leftchild=temp->rightchild=temp->parent=NULL;
    while(x!=NULL)
    {
        y = x;
        if(temp->root < x->root){x = x->leftchild;}
        else{x = x->rightchild;}
    }
    temp->parent = y;
    if(y == NULL){Tree = temp;}
    else if(temp->root < y->root){y->leftchild = temp;}
    else{y->rightchild = temp;}
    return Tree;
}
void Preorder(Node* Tree)
{
    if(Tree==NULL)return;
    printf(" %d", Tree->root);
    Preorder(Tree->leftchild);
    Preorder(Tree->rightchild);
}
void inorder(Node* Tree)
{
    if(Tree==NULL)return;
    inorder(Tree->leftchild);
    printf(" %d", Tree->root);
    inorder(Tree->rightchild);
}
void finder(Node* Tree, int num)
{
    if(Tree==NULL){printf("no\n");return;}
    if(num==Tree->root){printf("yes\n");return;}
    else if(num>Tree->root){finder(Tree->rightchild, num);}
    else{finder(Tree->leftchild, num);}
}
int main() {
    int n;
    int node;
    int num;
    char str[10];
    Node* Tree = NULL;
    scanf("%d", &n);
    for(int i=0;i<n;i++)
    {
        scanf("%s ", str);
        if(str[0]=='i')
        {
            scanf("%d", &node);
            Tree = insertTree(Tree, node);
        }
        else if(str[0]=='f')
        {
            scanf("%d", &num);
            finder(Tree, num);
        }
        else if(str[0]=='p')
        {inorder(Tree);printf("\n");Preorder(Tree);printf("\n");}
    }
    return 0;
}