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)

using System;
using System.Collections.Generic;
namespace alds18b
{
    class node{
        public int key;
        public node parent;
        public node left;
        public node right;

        public node(int key)
        {
            this.key = key;
        }
        public void writein()
        {
            if (left != null) left.writein();
            Console.Write(" ");
            Console.Write(key);
            if (right != null) right.writein();
        }
        public void writepre()
        {
            Console.Write(" ");
            Console.Write(key);
            if (left != null) left.writepre();
            if (right != null) right.writepre();
        }


    }
    class main
    {
        static void Main()
        {
            node root = null; ;
            int no = int.Parse(Console.ReadLine());
            for (int i = 0; i < no; i++)
            {
                string[] oder = Console.ReadLine().Split(' ');
                if (oder[0] == "insert")
                {
                    node x = root;
                    node y = null;
                    node z = new node(int.Parse(oder[1]));
                    while (x != null)
                    {
                        y = x;
                        if (z.key < x.key)
                            x = x.left;
                        else x = x.right;
                    }
                    z.parent = y;
                    if (y == null)
                    {
                        root = z;
                    }
                    else
                    {
                        if (z.key < y.key) y.left = z;
                        else y.right = z;
                    }
                }
                else if (oder[0] == "find")
                {
                    int target = int.Parse(oder[1]);
                    node cur = root;
                    while (true)
                    {
                        if (cur.key == target)
                        {
                            Console.WriteLine("yes");
                            break;
                        }
                        else if (cur.key > target)
                        {
                            cur = cur.left;
                        }
                        else
                        {
                            cur = cur.right;
                        }
                        if (cur == null)
                        {
                            Console.WriteLine("no");
                            break;
                        }

                    }
                }
                else
                {
                    root.writein();
                    Console.WriteLine();
                    root.writepre();
                    Console.WriteLine();
                }
            }
        }
    }
}