레드 블랙 트리

@codemaru · February 22, 2007 · 6 min read

         md 0
알고리즘 수업 레포트로 작성했던 레드 블랙 트리 자료입니다.
레드 블랙 트리가 별다를건 없지만 한 가지 특징이 있다면 주석이 참 친절하게 잘 달려 있습니다.
아마도 제가 이제껏 작업한 소스 중에 주석 젤 멋지게 단게 아니었나 하는 생각을 해봅니다. 궁금하신가요? ㅋㅋㅋ

주석 보기...

// n, n부모, n부모부모 노드로 리스트럭쳐링을 수행한다.  
// 리스트럭쳐링 완료 후의 중간 노드를 반환한다.  
template <class T>  
CRBNode<T> \*CRBTree<T>::\_trirest(RBNode \*n)  
{  
    RBNode    \*l, \*r;  
    RBNode    \*pn, \*ppn;  
    RBNode    \*pppn;  
    RBNode    \*mid;  
 
    ASSERT(n != NULL);  
    ASSERT(n->parent() != NULL);  
    ASSERT(n->parent()->parent() != NULL);  
 
    pn = n->parent();  
    ppn = pn->parent();  
    pppn = ppn->parent();  
 
    // 다음과 같은 두 단계에 걸쳐서 트라이노드 리스트럭쳐링을 한다.  
    //   
    // 1. 세 노드의 링크 기준을 판별하여, 적절하게   
    // 2. 세 노드중 부모노드가 된 mid의 부모를 연결한다.  
 
    // 1단계:  
    // 트라이 노드 리스트럭쳐링에는 총 네가지 경우가 있다.  
 
    if(ppn->left() == pn)  
    {  
 
        if(pn->left() == n)  
        {  
            // 1번 경우  
            //     pp  
            //    /  
            //   p  
            //  /  
            // c  
            ppn->left(pn->right());  
            pn->right(ppn);  
            mid = pn;  
        }  
        else  
        {  
            // 2번 경우  
            //     pp  
            //    /  
            //   p  
            //    \  
            //     c  
 
            l = n->left();  
            r = n->right();  
 
            n->left(pn);  
            n->right(ppn);  
            pn->right(l);  
            ppn->left(r);  
            mid = n;  
        }  
    }  
    else  
    {  
        if(pn->left() == n)  
        {  
            // 3번 경우  
            // pp  
            //  \  
            //   p  
            //  /  
            // c  
 
            l = n->left();  
            r = n->right();  
 
            n->left(ppn);  
            n->right(pn);  
            ppn->right(l);  
            pn->left(r);  
            mid = n;  
        }  
        else  
        {  
            // 4번 경우  
            // pp  
            //  \  
            //   p  
            //    \  
            //     c  
 
            ppn->right(pn->left());  
            pn->left(ppn);  
            mid = pn;  
        }  
    }  
 
    // 2단계:  
    // 이 단계에서는 mid를 기준으로 아래와 같은 형태로  
    // 리스트럭쳐링이 완료되었다.  
    //  
    //       mid  
    //      /   \  
    //    left   right  
    //  
    // 남은 작업은 pp의 부모노드의 링크를 mid로 연결 시켜주는 것이다.  
 
    if(pppn)  
    {  
        // ppp로 부모가 넘어온 경우  
        // ppp의 자식 링크로 mid를 가리키도록 설정한다.  
        if(pppn->right() == ppn)  
            pppn->right(mid);  
        else  
            pppn->left(mid);  
    }  
    else  
    {  
        // ppp가 없는 경우 pp가 루트 였으므로  
        // mid를 루트로 변경해 준다.  
        \_set\_root(mid);  
    }  
 
    return mid;  
}

위의 화면은 인터랙티브 모드를 캡쳐한 것이고, 아래는 문서와 실행 파일과 소스입니다. 레드 블랙 트리가 궁금하거나 배우고 싶은 분들은 고고씽. ㅋㅋ 근데 사실 이런거 실제 밥벌어 먹는데서는 한 번도 써 본 적이 없네요. ㅠㅠ온니 학교용인것 같습니다. 학교에서는 트리를 어찌나 많이 만들던지 ㅋ

레드 블랙 트리 아이디어는 정말 참신합니다. ㅋ
만든 사람 참 똑똑할 것 같다는 ㅎ^^

rbtree_src.zip rbtree_exe.zip rbtree_doc.zip

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중