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

typedef struct TreeNode * element;
#define MAX_QUEUE_SIZE 100
//typedef int *element;
typedef struct
{
 element queue[MAX_QUEUE_SIZE];
 int front, rear;
} QueueType;

void error(char *message)
{
 fprintf(stderr, "%s\n", message);
 exit(1);
}
void init(QueueType *q)
{
 q->front= q->rear=0;
}

int is_empty(QueueType *q)
{
 if(q->front==q->rear)
 return 1;
 else
  return 0;
}

int is_full(QueueType *q)
{
 return ((q->rear+1)%MAX_QUEUE_SIZE ==q->front);
}

void enqueue(QueueType *q, element item)
{
 if(is_full(q))
  error("\n큐가 포화");
 q->rear=(q->rear+1)%MAX_QUEUE_SIZE;
 q->queue[q->rear]=item;
}

element dequeue(QueueType *q)
{
 if(is_empty(q))
  error("\n큐가 공백");
 q->front=(q->front+1)%MAX_QUEUE_SIZE;
 return q->queue[q->front];
}

element peek(QueueType *q)
{
 if(is_empty(q))
  error("큐가 공백");
 return q->queue[(q->front+1) %MAX_QUEUE_SIZE];
}
typedef struct TreeNode
{
 int data;
 struct TreeNode *left, *right;
} TreeNode;

TreeNode n1={1, NULL, NULL};
TreeNode n2={4, &n1, NULL};
TreeNode n3={16, NULL, NULL};
TreeNode n4={25, NULL, NULL};
TreeNode n5={20, &n3 , &n4};
TreeNode n6={15, &n2, &n5};
TreeNode *root = &n6;

void level_order(TreeNode *ptr)
{
 int count=1;
 
 QueueType q;

 init(&q);
 if(!ptr) return;
 enqueue(&q, ptr);

 while(root)
 {
  ptr=dequeue(&q);
  
  if(count==1)
  {
  printf("                ");
  printf("%d\n", ptr->data);
  }  


  else if(count==2)
  {
  printf("           ");
  printf("%d", ptr->data);
  }  
  else if(count==3)
  {
  printf("          ");
  printf("%d\n", ptr->data);
  }
  else if(count>=4)
  {
  printf("      ");
  printf("%d", ptr->data);
  }  
  
  else if(count>=5)
  {
  printf("\n      ");
  printf("%d", ptr->data);
  }  
  


  if(ptr->left)
  {
   enqueue(&q, ptr->left);
  }

  if(ptr->right)
  {
   enqueue(&q, ptr->right);
  }
  count++;
 }
}
void delete_node(TreeNode **root, int data)
{
 TreeNode *p, *child, *succ, *succ_p, *t;

 p=NULL;
 t=*root;

 while(t!=NULL && t->data !=data)
 {
  p=t;
  t=(data<t->data) ? t->left : t->right;
 }

 if(t==NULL)
 {
  printf("data가 트리에 없다");
  return;
 }

 if((t->left==NULL)&&(t->right==NULL))
 {
  if(p!=NULL)
  {
   if(p->left==t)
    p->left=NULL;
   else p->right=NULL;
  }
  else
   *root=NULL;
 }
 else if((t->left==NULL)||(t->right==NULL))
 {
  child=(t->left!=NULL)? t->left: t->right;
  if(p !=NULL)
  {
   if(p->left==t)
    p->left=child;
   else p->right=child;
  }
  else
   *root=child;
 }
 else
 {
  succ_p=t;
  succ=t->right;

  while(succ->left!=NULL)
  {
   succ_p=succ;
   succ=succ->left;
  }
  if(succ_p->left==succ)
   succ_p->left=succ->right;

  else
   succ_p->right=succ->right;
  t->data=succ->data;
  t=succ;
 }
 free(t);
}
void main()
{
 QueueType q;
 init(&q);
 
 //insert_node(&root, 14);
 
 delete_node(&root, 4);
 level_order(root);


---------------------
이소스 인데 이런거 떠