Language: C


#include<stdio.h>
#include<stdlib.h>
  
struct node{
  struct node *right;
  struct node *left;
  struct node *parent;
  int key;
};
typedef struct node * Node;
#define NIL NULL
  
Node root;
  
Node tree_minimum(Node x){
  
    while(x->left != NULL){
      x = x->left;
    }
    return x;
}
  
Node tree_search(Node u, int k){
  
    if(u->key > k){
        if(u->left==NIL){  /* もし左側になければ，keyはない */
            return NIL;
        }
        return tree_search(u->left, k);
    }
    /* 自分より大きい値ならば，右側 */
    if(u->key < k){
        if(u->right == NULL){
            return NULL;      /* もし右側になければ，keyはない */
        }
        return tree_search(u->right, k);
    }
  
    return u;
}
 
Node treeSuccessor(Node x){
 
  if (x->right != NIL){
    return tree_minimum(x->right);
  }
  y = x->parent;
  while (y != NIL && x = y->right){
    x = y;
    y = y->parent;
    return y;
  }
}

  
void tree_delete(Node z){
 
  if(z != NIL){
      if(z->left == NIL || z->right == NIL){
         /* 左か右，どちらかがNULLであった場合(両方NULLの場合も含む) */
          y = z;
          if(z->left != NIL){
              x = y->right;
          } else {
             x = y->right;
          }
               
      } else 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;
        z->parent = y->parent;
        z->left = y->left;
        z->right = y->right;
      }
}
  
Node new_node(Node n, int k){
    Node z;
  
    z = malloc(sizeof(struct node));
    z->key = k;
    z->left = NIL;
    z->right = NIL;
    z->parent = n;
    return z;
}
  
void insert(int k){
  
    Node y = NIL;
    Node x = root;
    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 ; // if T is empty
    } else if (z->key < y->key){
        y->left = z;
    } else {
        y->right = z;
    }
}
  
void inorder(Node u){
    if(u != NIL){
        inorder(u->left);
        printf("%d", u->key);
        inorder(u->right);
    }
}
  
void preorder(Node u){
  printf("%d", u->key);
    if (u->left != NIL){
        preorder(u->left);
    }
  
    if (u->right != NIL){
        preorder(u->right);
    }
}
  
  
int main(){
  int n, i, x;
  char com[20];
  scanf("%d", &n);
  for ( i = 0; i < n; i++ ){
    scanf("%s", com);
    if ( com[0] == 'f' ){
      scanf("%d", &x);
      Node t = tree_search(root, x);
      if ( t != NIL ) printf("yes\n");
      else printf("no\n");
    } else if ( com[0] == 'i' ){
      scanf("%d", &x);
      insert(x);
    } else if ( com[0] == 'p' ){
      inorder(root);
      printf("\n");
      preorder(root);
      printf("\n");
    } else if ( com[0] == 'd' ){
      scanf("%d", &x);
      tree_delete(tree_search(root, x));
    }
  }
  
  return 0;
}

Compiler output:
main.c: In function 'treeSuccessor':
main.c:48:3: error: 'y' undeclared (first use in this function)
   48 |   y = x->parent;
      |   ^
main.c:48:3: note: each undeclared identifier is reported only once for each function it appears in
main.c: In function 'tree_delete':
main.c:62:11: error: 'y' undeclared (first use in this function)
   62 |           y = z;
      |           ^
main.c:64:15: error: 'x' undeclared (first use in this function)
   64 |               x = y->right;
      |               ^
main.c:168:1: error: expected declaration or statement at end of input
  168 | }
      | ^
main.c:168:1: error: expected declaration or statement at end of input