1) 각 노드의 메모리 반환

2) nil 노드와 tree의 메모리 반환

/* 2. RB tree 구조체가 차지했던 메모리 반환 */
// 트리와 노드의 메모리를 해제하는 함수
void delete_node(rbtree *t, node_t *node){
  // 노드의 왼쪽 자식이 nil이 아닌 경우
  if(node->left != t->nil)
    delete_node(t, node->left); // 왼쪽 자식 노드부터 재귀적으로 메모리 해제 수행
  // 노드의 오른쪽 자식이 nil이 아닌 경우
  if(node->right != t->nil)
    delete_node(t, node->right); // 오른쪽 자식 노드부터 재귀적으로 메모리 해제 수행
  // 현재 노드의 메모리 해제
  free(node);
}

// 트리를 삭제 시 순회하면서 각 노드의 메모리를 반환하는 함수
void delete_rbtree(rbtree *t) {
  // 트리의 루트 노드를 시작으로 순회
  node_t *node = t->root;
  // 루트 노드가 nil이 아닌 경우에만 순회하고 메모리 해제 수행
  if(node != t->nil)
    delete_node(t,node);
  free(t->nil); // nil 노드의 메모리 해제
  free(t); // 트리 자체의 메모리 해제
}