2ºÐ Ž»ö³ª¹«


ÇÔ¼ö¸í
search  2ºÐ Ž»ö³ª¹«¿¡ À־ÀÇ µ¥ÀÌÅÍÀÇ Å½»ö
insert  2ºÐ Ž»ö³ª¹«¿¡ À־ÀÇ ³ëµåÀÇ »ðÀÔ
delete  2ºÐ Ž»ö³ª¹«¿¡ À־ÀÇ ³ëµåÀÇ »èÁ¦
Çü½Ä
2ºÐ Ž»ö³ª¹«¿¡ À־ÀÇ µ¥ÀÌÅÍÀÇ Å½»ö
    NODE *search(int key);

2ºÐ Ž»ö³ª¹«¿¡ À־ÀÇ ³ëµåÀÇ »ðÀÔ
    NODE *insert(int key);

2ºÐ Ž»ö³ª¹«¿¡ À־ÀÇ ³ëµåÀÇ »èÁ¦
    int delete(int key);
Àμö
typedef struct _node {
    int key;               /* ºñ±³ÀÇ Å°°¡ µÇ´Â Çʵå */
    int info;              /* ±× ¿ÜÀÇ Çʵå */     
    struct _node *left;    /* ÁÂÃøÀÇ ¾ÆÀ̸¦ °¡¸®Å²´Ù */
    struct _node *right;   /* ¿ìÃøÀÇ ¾ÆÀ̸¦ °¡¸®Å²´Ù */
} NODE;

2ºÐ Ž»ö³ª¹«¿¡ À־ÀÇ µ¥ÀÌÅÍÀÇ Å½»ö ÇÔ¼ö¿¡ ´ëÇØ
    key   Ž»ö ¸ñÇ¥·Î ÇÏ´Â Å°ÀÇ °ª

2ºÐ Ž»ö³ª¹«¿¡ À־ÀÇ ³ëµåÀÇ »ðÀÔ ÇÔ¼ö¿¡ ´ëÇØ
    key   Ãß°¡ÇÏ°í ½ÍÀº Å°ÀÇ °ª

2ºÐ Ž»ö³ª¹«¿¡ À־ÀÇ ³ëµåÀÇ »èÁ¦ ÇÔ¼ö¿¡ ´ëÇØ
    key   »èÁ¦ÇÏ°í ½ÍÀº Å°ÀÇ °ª
ÇÔ¼öÄ¡
2ºÐ Ž»ö³ª¹«¿¡ À־ÀÇ µ¥ÀÌÅÍÀÇ Å½»ö ÇÔ¼ö¿¡ ´ëÇØ
    Ž»öÀÌ ¼º°øÇßÀ» ¶§´Â ¹ß°ßµÈ ³ëµå¿¡ÀÇ Æ÷ÀÎÅÍ.
    ½ÇÆÐ ¶§´Â NULL.

2ºÐ Ž»ö³ª¹«¿¡ À־ÀÇ µ¥ÀÌÅÍÀÇ »ðÀÔ ÇÔ¼ö¿¡ ´ëÇØ
    »ðÀÔÀÌ ¼º°øÇßÀ» ¶§´Â »ðÀÔÇÑ ³ëµå¿¡ÀÇ Æ÷ÀÎÅÍ.
    »ðÀÔ ½ÇÆÐ ¶§³ª »ðÀÔÇÏ·Á°í ÇÏ´Â Å°°¡ ÀÌ¹Ì ÀÖÀ» ¶§´Â NULL.

2ºÐ Ž»ö³ª¹«¿¡ À־ÀÇ µ¥ÀÌÅÍÀÇ »èÁ¦ ÇÔ¼ö¿¡ ´ëÇØ
    »èÁ¦°¡ ¼º°øÇßÀ» ¶§´Â 0.
    »èÁ¦ÇÏ·Á°í ÇÏ´Â Å°°¡ Á¸ÀçÇÏ°í ÀÖÁö ¾ÊÀ» ¶§´Â -1.
ÁÖÀÇ »çÇ×
2ºÐ Ž»ö³ª¹«ÀÇ ·çÆ®¸¦ ³ªÅ¸³»´Âµ¥, Á¤Àû º¯¼ö root °¡ »ç¿ëµÇ°í ÀÖ´Ù.

¿ë·Ê(binaryTree-test.c )

ÇÁ·Î±×·¥(binaryTree.c )
static NODE *root = NULL;

NODE *search(int key){
    NODE *node = root;

    while (node ! = NULL) {
        if (key == node->key) 
            return node;
        if (key < node->key) 
            node = node->left;
        else                 
            node = node->right;
    }
    return NULL;
}

NODE *insert(int key){
    NODE **node = &root;

    while (*node ! = NULL) {
        if (key == (*node)->key) return NULL;
        if (key < (*node)->key) node = &((*node)->left);
        else                    node = &((*node)->right);
    }
    if ((*node = (NODE *) malloc(sizeof(NODE))) == NULL) return NULL;
    (*node)->key  = key;
    (*node)->left = (*node)->right = NULL;
    return (*node);
}

int delete(int key){
    NODE **node = &root;
    NODE *next, **leftmax, *tmp;

    for (;;) {
        if (*node == NULL) return -1;
        if (key == (*node)->key) break;
        if (key < (*node)->key) node = &((*node)->left);
        else                    node = &((*node)->right);
    }
    
    if ((*node)->left == NULL) 
next = (*node)->right; else { leftmax = &((*node)->left); while ((*leftmax)->right ! = NULL) leftmax = &((*leftmax)->right); next = *leftmax; *leftmax = (*leftmax)->left; next->left = (*node)->left; next->right = (*node)->right; } tmp = *node; *node = next; free(tmp); return 0; }
¼³¸í
2ºÐ ³ª¹«ÀÇ °¢ ³ëµå¿¡ µ¥ÀÌÅÍ°¡ ÀÖ¾î, ¾î´À ³ëµå·ÎºÎÅÍ ºÁ ÁÂÃøÀÇ ÀÚ¼Õ ³ëµåÀÇ µ¥ÀÌÅÍ ¸ðµç °ÍÀÌ ÀÌ ³ëµåÀÇ µ¥ÀÌÅÍÀÇ °ªº¸´Ù ÀÛ°í, ÇÑÆí, ¿ìÃø ÀÇ ÀÚ¼Õ ³ëµåÀÇ µ¥ÀÌÅÍ ¸ðµç °ÍÀÌ Å©´Ù°í ÇÏ´Â °ü°è°¡ ¼º¸³ÇÏ´Â °ÍÀ» 2ºÐ Ž»ö³ª¹«¶ó°í ÇÑ´Ù.

2ºÐ Ž»ö³ª¹«¿¡ ÀÇÇÑ Å½»öÀº, ·çÆ®·ÎºÎÅÍ ½ÃÀÛÇØ Å½»ö Å°ÀÇ °ªÀÌ ±× ³ëµåÀÇ µ¥ÀÌÅͺ¸´Ù ÀÛÀº°¡ Å« °Íó·³ µû¶ó, ÁÂÃø ¶Ç´Â ¿ìÃøÀÇ ¾ÆÀÌ ³ëµå ¶ó°í °£´Ù.

¿ÏÀüÇÏ°Ô ³¬½Ã°¡ ÃëÇϸé 2ºÐ Ž»ö³ª¹«¶ó¸é, n °³ÀÇ °ÍÀ» Á¶»çÇϴµ¥ ÇÊ¿äÇÑ ºñ±³ ȸ¼ö (Àº)´Â O(log n)ÀÌ´Ù. ±×·¯³ª, Á¿ìÀÇ ¹ë·±½º°¡ ³ª»Û ³ª¹«¿¡¼­´Â Ž»ö ½Ã°£ÀÌÀΰ¡ ºô·Á ÃÖ¾Ç °æ¿ìÀÇ °è»ê·®Àº O(n)ÀÌ´Ù.

¶Ç, »èÁ¦ÀÇ ÇÁ·Î±×·¥ÀÌ ²Ï º¹ÀâÇÏ°Ô µÇ¾î ¹ö¸®´Â °ÍÀº, 2ºÐ Ž»ö³ª¹« ÀÇ Æ¯Â¡ÀÌ´Ù. »ý°¢ÇØ¾ß ÇÒ ÄÉÀ̽º·Î¼­ »èÁ¦ÇÏ·Á°í ÇÏ´Â ³ëµå°¡

  1. ÁÂÃøÀ¸·Î ¾ÆÀÌ ³ëµå¸¦ °®Áö ¾Ê´Â °æ¿ì
    ÀÚ±â ÀÚ½ÅÀ» ¿ìÃøÀÇ ºÎºÐ³ª¹«·Î ¿Å°Ü³õ´Â´Ù. Áï, Ä£³ëµå·ÎºÎÅÍ ¿ìÃøÀÇ ºÎºÐ³ª¹«¿¡ ´Ù½Ã ¸µÅ©ÇÑ´Ù.
  2. ÁÂÃøÀ¸·Î ¾ÆÀÌ ³ëµå¸¦ °¡Áö´Â °æ¿ì
    ÁÂÃøÀÇ ºÎºÐ³ª¹«·ÎºÎÅÍ ÃÖ´ëÀÇ ³ëµå¸¦ ã¾Æ³», ÀÚ±â ÀÚ½ÅÀ» ±× ³ëµå·Î ¿Å°Ü³õ´Â´Ù. ¸µÅ©ÀÇ ÀÇ¿å ¼ö¼± µî, ¸î°³ÀÇ Á¶ÀÛÀÌ ÇÊ¿äÇÏ´Ù.

Ž»öÀ̳ª »ðÀÔÀÇ ´Ü¼øÇÑ ·çƾº¸´Ù ¾î·ÆÁö¸¸, ÁÖÀÇ ±í°Ô »ý°¢ÇÏ´Â °¡Ä¡°¡ ÀÖÀÚ.

µ¡ºÙ¿© 2ºÐ Ž»ö³ª¹«ÀÇ ¼ºÁú»ó, °°Àº Ž»ö Å°¸¦ °¡Áö´Â ³ëµå´Â 1°³ ¹Û¿¡ ¾ø´Â°Å¾ß ±×¸®°í, °°Àº Ž»ö Å°¿¡ º¹¼öÀÇ µ¥ÀÌÅ͸¦ °¡Áö´Â °æ¿ì´Â µ¥ÀÌÅÍ ±¸Á¶ÁßÀÇ info¸¦ ±Ã¸® ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.

°ü·Ã ÇÔ¼ö
¼±Çü Ž»ö, ÀÚü Á¶Á÷È­ Ž»ö, 2ºÐ Ž»ö, AVL³ª¹«, B³ª¹« Ž»ö