Problem p02285 (C++) — buggy submission, verdict: Runtime Error

#include <iostream>

using namespace std;

struct Node {
  Node *Lson;
  Node *Rson;
  Node *parent;
  int key;
};

void print();
void insert(int k);
void In(Node *p);
void Pro(Node *p);
int find(int k);
void Delete(int k);
Node *getDelete(Node *p);

Node *root;

int main(void) {
  int m;

  cin >> m;
  while (m--) {
    char order[10];

    cin >> order;
    if (order[0] == 'i') {
      int k;

      cin >> k;
      insert(k);
    } else if (order[0] == 'p') {
      print();
    } else if (order[0] == 'f') {
      int k;

      cin >> k;
      if (find(k)) {
        cout << "yes" << endl;
      } else {
        cout << "no" << endl;
      }
    } else {
      int k;

      cin >> k;
      Delete(k);
    }
  }

  return 0;
}

int find(int k) {
  Node *temp = root;

  while (temp != NULL && temp->key != k) {
    if (k < temp->key) {
      temp = temp->Lson;
    } else
      temp = temp->Rson;
  }
  if (temp == NULL)
    return 0;
  else
    return 1;
}

void insert(int k) {
  Node *father, *temp;

  father = NULL;
  temp = root;

  Node *New = new Node;
  New->key = k;
  New->parent = NULL;
  New->Lson = NULL;
  New->Rson = NULL;

  while (temp != NULL) {
    father = temp;
    if (k < temp->key)
      temp = temp->Lson;
    else
      temp = temp->Rson;
  }

  New->parent = father;
  if (father == NULL)
    root = New;
  else if (k < father->key)
    father->Lson = New;
  else
    father->Rson = New;
}

void print() {
  In(root);
  cout << endl;
  Pro(root);
  cout << endl;
}

void In(Node *p) {
  if (p == NULL)
    return;
  In(p->Lson);
  cout << " " << p->key;
  In(p->Rson);
}

void Pro(Node *p) {
  if (p == NULL)
    return;
  cout << " " << p->key;
  Pro(p->Lson);
  Pro(p->Rson);
}

void Delete(int k) {
  Node *temp = root, *wait_delete,
       *wait_temp; // temp k??????  wait_delete´????????? wait_temp
                   // ´????????????£??×?????
  if (find(k)) {
    while (temp != NULL && temp->key != k) {
      if (k < temp->key) {
        temp = temp->Lson;
      } else
        temp = temp->Rson;
    }
    if (temp->Lson == NULL || temp->Rson == NULL) {
      wait_delete = temp;
    } else
      wait_delete = getDelete(temp);
    if (wait_delete->Lson != NULL)
      wait_temp = wait_delete->Lson;
    else
      wait_temp = wait_delete->Rson;

    if (wait_temp != NULL)
      wait_temp->parent = wait_delete->parent;

    if (wait_delete->parent == NULL)
      root = wait_temp;
    else if (wait_delete == wait_delete->parent->Lson)
      wait_delete->parent->Lson = wait_temp;
    else
      wait_delete->parent->Rson = wait_temp;

    if (wait_delete != temp)
      temp->key = wait_delete->key;
  }
  delete wait_delete;
}

Node *getDelete(Node *p) {
  if (p->Rson != NULL) {
    p = p->Rson;
    while (p->Lson != NULL)
      p = p->Lson;
    return p;
  }
  Node *father = p->parent;
  while (father != NULL && p == father->Rson) {
    p = father;
    father = father->parent;
  }
  return father;
}

Error: 0

Fixed submission:

#include <iostream>

using namespace std;

struct Node {
  Node *Lson;
  Node *Rson;
  Node *parent;
  int key;
};

void print();
void insert(int k);
void In(Node *p);
void Pro(Node *p);
int find(int k);
void Delete(int k);

Node *root;

int main(void) {
  int m;

  cin >> m;
  while (m--) {
    char order[10];

    cin >> order;
    if (order[0] == 'i') {
      int k;

      cin >> k;
      insert(k);
    } else if (order[0] == 'p') {
      print();
    } else if (order[0] == 'f') {
      int k;

      cin >> k;
      if (find(k)) {
        cout << "yes" << endl;
      } else {
        cout << "no" << endl;
      }
    } else {
      int k;

      cin >> k;
      Delete(k);
    }
  }

  return 0;
}

int find(int k) {
  Node *temp = root;

  while (temp != NULL && temp->key != k) {
    if (k < temp->key) {
      temp = temp->Lson;
    } else
      temp = temp->Rson;
  }
  if (temp == NULL)
    return 0;
  else
    return 1;
}

void insert(int k) {
  Node *father, *temp;

  father = NULL;
  temp = root;

  Node *New = new Node;
  New->key = k;
  New->parent = NULL;
  New->Lson = NULL;
  New->Rson = NULL;

  while (temp != NULL) {
    father = temp;
    if (k < temp->key)
      temp = temp->Lson;
    else
      temp = temp->Rson;
  }

  New->parent = father;
  if (father == NULL)
    root = New;
  else if (k < father->key)
    father->Lson = New;
  else
    father->Rson = New;
}

void print() {
  In(root);
  cout << endl;
  Pro(root);
  cout << endl;
}

void In(Node *p) {
  if (p == NULL)
    return;
  In(p->Lson);
  cout << " " << p->key;
  In(p->Rson);
}

void Pro(Node *p) {
  if (p == NULL)
    return;
  cout << " " << p->key;
  Pro(p->Lson);
  Pro(p->Rson);
}

void Delete(int k) {
  Node *temp = root;
  if (find(k)) {
    while (temp != NULL && temp->key != k) {
      if (k < temp->key) {
        temp = temp->Lson;
      } else
        temp = temp->Rson;
    }
    if (temp->Lson == NULL && temp->Rson == NULL) {
      if (temp->key < temp->parent->key) {
        temp->parent->Lson = NULL;
      } else
        temp->parent->Rson = NULL;
      delete temp;
    } else if (temp->Lson == NULL || temp->Rson == NULL) {
      if (temp->Lson != NULL) {
        temp->parent->Lson = temp->Lson;
        temp->Lson->parent = temp->parent;
      } else {
        temp->parent->Rson = temp->Rson;
        temp->Rson->parent = temp->parent;
      }
      delete temp;
    } else {
      Node *newtemp = temp->Rson;
      while (newtemp->Lson != NULL) {
        newtemp = newtemp->Lson;
      }
      temp->key = newtemp->key;
      newtemp->parent->Lson = NULL;
      delete newtemp;
    }
  }
}