#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
 
int n;
 
struct node{
    int l,r,par;
    int key;
    void init(int a,int p){
        l=r=-1;
        par=p;
        key=a;
    }
};
struct bst{
    int size;
    node t[600001];
    void init(){
        size=0;
    }
    void insert(int v){
        int i=0,p=-1;
        while(i<size){
            int& child=(v<t[i].key?t[i].l:t[i].r);
            if(child==-1)child=size;
            p=i;
            i=child;
        }
        t[size++].init(v,p);
    }
    bool find(int v){
        int i=0;
        while(i<size){
            if(t[i].key==v)return true;
            int child=(v<t[i].key?t[i].l:t[i].r);
            if(child==-1)child=size;
            i=child;
        }
        return false;
    }
 
    void kesu(int v){
        int i=0;
        while(i<size){
            if(t[i].key==v){
                if(t[i].l==-1 && t[i].r==-1){
                    if(t[i].par!=-1){
                        int p=t[i].par;
                        if(t[p].key>=t[i].key)t[p].l=-1;
                        else t[p].r=-1;
                    }
                    t[i].init(-1,-1);
                }else if(t[i].l==-1){
                    int nex=t[i].r;
                    t[i].key=t[nex].key;
                    t[i].l=t[nex].l;
                    t[i].r=t[nex].r;
                    t[nex].init(-1,-1);
                }else if(t[i].r==-1){
                    int nex=t[i].l;
                    t[i].key=t[nex].key;
                    t[i].l=t[nex].l;
                    t[i].r=t[nex].r;
                    t[nex].init(-1,-1);
                }else{
                    int nex=t[i].r;
                    int p=-1;
                    while(t[nex].l!=-1){
                        p=nex;
                        nex=t[nex].l;
                    }
                    t[i].key=t[nex].key;
                    if(p!=-1){
                        t[p].l=-1;
                    }else t[i].r=-1;
                    t[nex].init(-1,-1);
                }
                return;
            }
            int child=(v<t[i].key?t[i].l:t[i].r);
            if(child==-1)return;
            i=child;
        }
    }
 
    void preorder(int pos){
        if(pos==-1|| pos==size)return;
        printf(" %d",t[pos].key);
        preorder(t[pos].l);
        preorder(t[pos].r);
    }
 
    void inorder(int pos){
        if(pos==-1|| pos==size)return;
        inorder(t[pos].l);
        printf(" %d",t[pos].key);
        inorder(t[pos].r);
    }
 
    void postorder(int pos){
        if(pos==-1|| pos==size)return;
        postorder(t[pos].l);
        postorder(t[pos].r);
        printf(" %d",t[pos].key);
    }
};
 
bst T;
 
int main(void){
    scanf("%d",&n);
    char str[100];
    for(int i=0;i<n;i++){
        scanf("%s",str);
        if(str[0]=='i'){
            int a;
            scanf("%d",&a);
            T.insert(a);
        }else if(str[0]=='f'){
            int a;
            scanf("%d",&a);
            printf("%s\n",T.find(a)?"yes":"no");
        }else if(str[0]=='d'){
            int a;
            scanf("%d",&a);
            T.kesu(a);
        }else{
            T.inorder(0);
            printf("\n");
            T.preorder(0);
            printf("\n");
        }
    }
    return 0;
}

Measured memory_bytes: 8936