#include<stdio.h>
#include<stdlib.h>

struct node{
	int key;
	struct node *parent;
	struct node *left;
	struct node *right;
};

typedef struct node *Node;

Node root,NIL;

Node getMinimum(Node x){
	while(x->left != NIL){ x = x->left; }
  return x;
}


Node find(Node x,int k){
	while( x != NIL && k != x->key ){
		if(k < x->key){ x = x->left; }
		else{ x = x->right; }
	}
	return x;
}

Node getSuccessor(Node x){
	Node y;
	if(x->right != NIL){ return getMinimum(x->right); }

	y = x->parent;
	while( y != NIL && x ==y->right ){
		x = y;
		y = y->parent;
	}
	return y;
}

void delete(Node z){
	Node x;
	Node y;

	if(z->left == NIL || z->right == NIL){ y = z; }
	else{ y = getSuccessor(z); }

	if(y->left != NIL){ x = y->left; }
	else{ x = y->right; }

	if(x != NIL){ x->parent = y->parent; }

	if(y->parent == NIL){ root = x; }
	else{
		if(y == y->parent->left){ y->parent->left = x; }
		else{ y->parent->right = x; }
	}

	if(y != z){ z->key = y->key; }
}


void insert(int k){
	Node y = NIL;
	Node x = root;

	Node z = (Node)malloc(sizeof(struct node));
	z->key = k;
	z->left = NIL;
	z->right = NIL;

	while(x != NIL){
		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 == NIL){ return; }
	inorder(u->left);
	printf(" %d",u->key);
	inorder(u->right);
}

void preorder(Node u){
	if(u == NIL){ return; }
	printf(" %d",u->key);
	preorder(u->left);
	preorder(u->right);
}

void print(){
	inorder(root);
	puts("");
	preorder(root);
	puts("");
}

int main(){
	int n,i,j,z,x;
	char s[10];

	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%s",s);
		if(s[0] == 'f'){
			scanf("%d",&x);
			Node t = find(root,x);
			if(t == NIL)printf("no\n");
			else printf("yes\n");
		}
		else if(s[0] == 'i'){
			scanf("%d",&z);
			insert(z);
		}
		else if(s[0] == 'd'){
			scanf("%d", &z);
			delete(find(root,z));
		}
		else{ print(); }
	}
	return 0;
}


