亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rb_tree.h

?? 紅黑樹數據結構的c實現
?? H
字號:
////////////////
//  rb_tree.h
//
//  author: Wei Ke
//  file created: 7/14/2002 3:06:41 AM
//  file last modified: 7/25/2002 6:10:33 PM

#ifndef __RB_TREE_H
#define __RB_TREE_H

#pragma pack(push, 4)
////////////////

template<typename T>
struct rb_tree {
    typedef T node_type;
    typedef node_type *p_node_type;
    typedef node_type const *cp_node_type;
    typedef typename node_type::key_type key_type;

    static p_node_type Find(p_node_type Tree, key_type Key);
    static p_node_type Insert(p_node_type Tree, p_node_type Node);
    static p_node_type Delete(p_node_type Tree, p_node_type Node);

private:
    static p_node_type Rotate_left(p_node_type Tree, p_node_type Node) {
        p_node_type R = Get_right(Node), RL = Get_left(R), Pa = Get_parent(Node);
        Set_parent(R, Pa);
        Set_parent(Node, R);
        Set_right(Node, RL);
        Set_left(R, Node);
        Set_parent_ignore_nil(RL, Node);

        if ( Pa ) {
            if ( Get_left(Pa) == Node )
                Set_left(Pa, R);
            else
                Set_right(Pa, R);
            return Tree;
        } else 
            return R;
    }

    static p_node_type Rotate_right(p_node_type Tree, p_node_type Node) {
        p_node_type L = Get_left(Node), LR = Get_right(L), Pa = Get_parent(Node);
        Set_parent(L, Pa);
        Set_parent(Node, L);
        Set_left(Node, LR);
        Set_right(L, Node);
        Set_parent_ignore_nil(LR, Node);

        if ( Pa ) {
            if ( Get_left(Pa) == Node )
                Set_left(Pa, L);
            else
                Set_right(Pa, L);
            return Tree;
        } else 
            return L;
    }

    static p_node_type Tree_succ(p_node_type Node) {
        p_node_type P = Get_right(Node);

        p_node_type L;
        while ( (L = Get_left(P)) )
            P = L;

        return P;
    }

    static p_node_type Delete_fixup(p_node_type Tree, p_node_type Parent, p_node_type Node) {
        p_node_type Pa = Parent, P = Node, Tr = Tree;
        p_node_type Q;

        while ( Pa && Is_black_or_nil_node(P) ) {
            if ( P == Get_left(Pa) ) {
                Q = Get_right(Pa);
                if ( Is_red_node(Q) ) {
                    Set_red_node(Q, false);
                    Set_red_node(Pa, true);
                    Tr = Rotate_left(Tr, Pa);
                    Q = Get_right(Pa);
                }

                if ( Is_black_or_nil_node(Get_left(Q)) && Is_black_or_nil_node(Get_right(Q)) ) {
                    Set_red_node(Q, true);
                    P = Pa;
                    Pa = Get_parent(P);
                } else {
                    if ( Is_black_or_nil_node(Get_right(Q)) ) {
                        Set_red_node(Get_left(Q), false);
                        Set_red_node(Q, true);
                        Tr = Rotate_right(Tr, Q);
                        Q = Get_right(Pa);
                    }
                    Set_red_node(Q, Is_red_node(Pa));
                    Set_red_node(Pa, false);
                    Set_red_node(Get_right(Q), false);
                    Tr = Rotate_left(Tr, Pa);
                    P = Tr;
                    Pa = 0;
                }
            } else {
                Q = Get_left(Pa);
                if ( Is_red_node(Q) ) {
                    Set_red_node(Q, false);
                    Set_red_node(Pa, true);
                    Tr = Rotate_right(Tr, Pa);
                    Q = Get_left(Pa);
                }

                if ( Is_black_or_nil_node(Get_left(Q)) && Is_black_or_nil_node(Get_right(Q)) ) {
                    Set_red_node(Q, true);
                    P = Pa;
                    Pa = Get_parent(P);
                } else {
                    if ( Is_black_or_nil_node(Get_left(Q)) ) {
                        Set_red_node(Get_right(Q), false);
                        Set_red_node(Q, true);
                        Tr = Rotate_left(Tr, Q);
                        Q = Get_left(Pa);
                    }
                    Set_red_node(Q, Is_red_node(Pa));
                    Set_red_node(Pa, false);
                    Set_red_node(Get_left(Q), false);
                    Tr = Rotate_right(Tr, Pa);
                    P = Tr;
                    Pa = 0;
                }
            }
        }
        if ( P )
            Set_red_node(P, false);

        return Tr;
    }

    static int Comp_key_node(key_type Key, cp_node_type Node) {return node_type::Comp_key_node(Key, Node);}
    static int Comp_node_node(cp_node_type Node_1, cp_node_type Node_2) {return node_type::Comp_node_node(Node_1, Node_2);}
    static bool Is_red_node(cp_node_type Node) {return node_type::Is_red_node(Node);}
    static bool Is_black_or_nil_node(cp_node_type Node) {return !Node || !Is_red_node(Node);}
    static void Set_red_node(p_node_type Node, bool Red) {node_type::Set_red_node(Node, Red);}
    static p_node_type Get_left(cp_node_type Node) {return node_type::Get_left(Node);}
    static void Set_left(p_node_type Node, p_node_type Left) {node_type::Set_left(Node, Left);}
    static p_node_type Get_right(cp_node_type Node) {return node_type::Get_right(Node);}
    static void Set_right(p_node_type Node, p_node_type Right) {node_type::Set_right(Node, Right);}
    static p_node_type Get_parent(cp_node_type Node) {return node_type::Get_parent(Node);}
    static void Set_parent(p_node_type Node, p_node_type Parent) {node_type::Set_parent(Node, Parent);}
    static void Set_parent_ignore_nil(p_node_type Node, p_node_type Parent) {if ( Node ) Set_parent(Node, Parent);}
};

template<typename T>
rb_tree<T>::p_node_type rb_tree<T>::Find(rb_tree<T>::p_node_type Tree, rb_tree<T>::key_type Key)
{
    p_node_tree P = Tree;

    while ( P ) {
        int Comp = Comp_key_node(Key, P);
        if ( Comp == 0 )
            break;

        P = ( Comp < 0 )? Get_left(P) : Get_right(P);
    }

    return P;
}

template<typename T>
rb_tree<T>::p_node_type rb_tree<T>::Insert(rb_tree<T>::p_node_type Tree, rb_tree<T>::p_node_type Node)
{
    if ( !Node )
        return Tree;

    Set_left(Node, 0);
    Set_right(Node, 0);

    if ( !Tree ) {
        Set_red_node(Node, false);
        Set_parent(Node, 0);

        return Node;
    }
    
    p_node_type P = Tree, Q;

    do {
        Q = P;
        if ( Comp_node_node(Node, Q) < 0 ) {
            P = Get_left(Q);
            if ( !P )
                Set_left(Q, Node);
        } else {
            P = Get_right(Q);
            if ( !P )
                Set_right(Q, Node);
        }
    } while ( P );

    Set_parent(Node, Q);
    Set_red_node(Node, true);

    P = Node;
    p_node_type Pa, Pa2, Tr = Tree;

    while ( P != Tr && Is_red_node(Pa = Get_parent(P)) ) {
        if ( Pa == Get_left(Pa2 = Get_parent(Pa)) ) {
            Q = Get_right(Pa2);
            if ( !Is_black_or_nil_node(Q) ) {
                Set_red_node(Pa, false);
                Set_red_node(Q, false);
                Set_red_node(Pa2, true);
                P = Pa2;
            } else {
                if ( P == Get_right(Pa) ) {
                    P = Pa;
                    Tr = Rotate_left(Tr, P);
                    Pa = Get_parent(P);
                    Pa2 = Get_parent(Pa);
                }
                Set_red_node(Pa, false);
                Set_red_node(Pa2, true);
                Tr = Rotate_right(Tr, Pa2);
            }
        } else {
            Q = Get_left(Pa2);
            if ( !Is_black_or_nil_node(Q) ) {
                Set_red_node(Pa, false);
                Set_red_node(Q, false);
                Set_red_node(Pa2, true);
                P = Pa2;
            } else {
                if ( P == Get_left(Pa) ) {
                    P = Pa;
                    Tr = Rotate_right(Tr, P);
                    Pa = Get_parent(P);
                    Pa2 = Get_parent(Pa);
                }
                Set_red_node(Pa, false);
                Set_red_node(Pa2, true);
                Tr = Rotate_left(Tr, Pa2);
            }
        }
    }

    Set_red_node(Tr, false);

    return Tr;
}

template<typename T>
rb_tree<T>::p_node_type rb_tree<T>::Delete(rb_tree<T>::p_node_type Tree, rb_tree<T>::p_node_type Node)
{
    if ( !Tree || !Node )
        return Tree;

    p_node_type P, Pa;

    if ( !Get_left(Node) || !Get_right(Node) ) {
        P = Get_right(Node);
        if ( !P )
            P = Get_left(Node);
        Pa = Get_parent(Node);
        Set_parent_ignore_nil(P, Pa);
        if ( Pa ) {
            if ( Node == Get_left(Pa) )
                Set_left(Pa, P);
            else
                Set_right(Pa, P);
            return ( Is_red_node(Node) )? Tree : Delete_fixup(Tree, Pa, P);
        } else
            return ( Is_red_node(Node) )? P : Delete_fixup(P, 0, P);
    }

    p_node_type Q = Tree_succ(Node);
    P = Get_right(Q);
    Pa = Get_parent(Q);
    Set_parent_ignore_nil(P, Pa);

    if ( Q == Get_left(Pa) )
        Set_left(Pa, P);
    else
        Set_right(Pa, P);
    
    p_node_type Pa2 = Get_parent(Node);
    Set_parent(Q, Pa2);
    Set_left(Q, Get_left(Node));
    Set_parent_ignore_nil(Get_left(Node), Q);
    Set_right(Q, Get_right(Node));
    Set_parent_ignore_nil(Get_right(Node), Q);

    bool Red = Is_red_node(Q);
    Set_red_node(Q, Is_red_node(Node));

    if ( Pa == Node )
        Pa = Q;

    if ( Pa2 ) {
        if ( Node == Get_left(Pa2) )
            Set_left(Pa2, Q);
        else
            Set_right(Pa2, Q);
        return ( Red )? Tree : Delete_fixup(Tree, Pa, P);
    } else 
        return ( Red )? Q : Delete_fixup(Q, Pa, P);
}

template<typename T>
struct rb_tree_node {
    typedef T node_type;
    typedef node_type *p_node_type;
    typedef node_type const *cp_node_type;
    
    static p_node_type Get_left(cp_node_type Node) {return static_cast<const rb_tree_node*>(Node)->m_Left;} 
    static void Set_left(p_node_type Node, p_node_type Left) {static_cast<rb_tree_node*>(Node)->m_Left = Left;} 
    static p_node_type Get_right(cp_node_type Node) {return static_cast<const rb_tree_node*>(Node)->m_Right;} 
    static void Set_right(p_node_type Node, p_node_type Right) {static_cast<rb_tree_node*>(Node)->m_Right = Right;} 
    static p_node_type Get_parent(cp_node_type Node) {return static_cast<const rb_tree_node*>(Node)->m_Parent;} 
    static void Set_parent(p_node_type Node, p_node_type Parent) {static_cast<rb_tree_node*>(Node)->m_Parent = Parent;} 
    static bool Is_red_node(cp_node_type Node) {return static_cast<const rb_tree_node*>(Node)->m_Red;} 
    static void Set_red_node(p_node_type Node, bool Red) {static_cast<rb_tree_node*>(Node)->m_Red = Red;} 
private:
    p_node_type m_Left, m_Right, m_Parent;
    bool m_Red;
};

////////////////
#pragma pack(pop)
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色94色欧美sute亚洲13| 亚洲美女区一区| www.欧美日韩| 视频精品一区二区| 国产精品入口麻豆九色| 欧洲精品视频在线观看| 免费精品视频最新在线| 国产欧美日产一区| 综合av第一页| 亚洲bt欧美bt精品| 中文字幕在线不卡一区| 欧美精品乱人伦久久久久久| 亚洲午夜久久久久| 91精品国产手机| 大胆亚洲人体视频| 伊人色综合久久天天人手人婷| 欧美午夜一区二区三区| 国产精品亚洲一区二区三区在线| 亚洲成人动漫一区| 亚洲欧美一区二区在线观看| 久久免费偷拍视频| 日韩欧美国产成人一区二区| 精品视频在线免费观看| 成人av免费观看| 国产高清久久久| 国产高清成人在线| 国产福利91精品一区| 99久久99久久免费精品蜜臀| 狠狠色丁香久久婷婷综| 一本大道久久a久久综合| 欧美一区日韩一区| 国产午夜亚洲精品理论片色戒 | 日韩三级视频中文字幕| 欧美一区二区黄| 精品国产91久久久久久久妲己| 欧美一卡二卡三卡| 国产日产欧美一区| 成人免费在线播放视频| 日日摸夜夜添夜夜添亚洲女人| 日本欧美大码aⅴ在线播放| 久久精品国产网站| 99久久精品国产导航| 91麻豆精品国产91久久久资源速度| 日韩精品最新网址| 一二三区精品视频| 国产精品一级二级三级| 3d动漫精品啪啪一区二区竹菊| 国产女同性恋一区二区| 视频在线观看91| 国产成人综合在线播放| 日本高清不卡在线观看| 国产色一区二区| 美女在线观看视频一区二区| 91免费观看在线| **性色生活片久久毛片| 久久精品国产99国产精品| 色婷婷久久综合| 1000部国产精品成人观看| 精品一区二区三区香蕉蜜桃 | 午夜精品久久久久| 色婷婷av一区二区三区gif | 欧美极品少妇xxxxⅹ高跟鞋| 美女精品一区二区| 精品国产一区二区三区av性色| 日日摸夜夜添夜夜添国产精品| 欧美在线观看一区二区| 一区二区三区精品在线| 欧美日韩中文字幕一区二区| 亚洲国产一区二区三区| 欧美精选午夜久久久乱码6080| 亚洲综合另类小说| 欧美成人a∨高清免费观看| 麻豆传媒一区二区三区| 久久影院午夜论| 在线免费观看日韩欧美| 亚洲精品国产精品乱码不99| 一区二区理论电影在线观看| 亚洲综合999| 欧美国产精品一区| 久久久亚洲精华液精华液精华液| 国产精品资源网站| 亚洲一区二区三区视频在线| 精品区一区二区| 国产91精品免费| 三级久久三级久久| 久久久久久久网| 3d成人动漫网站| 成人h精品动漫一区二区三区| 亚洲精品免费在线| 欧美日韩久久久一区| 激情文学综合网| 亚洲第一成年网| 亚洲欧洲国产日本综合| 91精品欧美综合在线观看最新| 国产成人精品一区二区三区四区| 一二三区精品福利视频| 国产精品色呦呦| 久久免费电影网| 欧美喷潮久久久xxxxx| 国产成人亚洲综合a∨婷婷| 免费xxxx性欧美18vr| 亚洲成人精品影院| 奇米影视一区二区三区| 午夜国产精品一区| 免费欧美高清视频| 亚洲精品中文在线观看| 中文字幕一区二区三区不卡 | 91福利社在线观看| av激情成人网| 在线观看精品一区| 色欧美乱欧美15图片| 91亚洲国产成人精品一区二区三| 成人h动漫精品一区二区| 国产a精品视频| 国产成人无遮挡在线视频| 国内精品第一页| 国产精品99久久久久久久女警 | 亚洲欧美日韩国产手机在线| 欧美激情一区二区三区| 亚洲视频中文字幕| 男男gaygay亚洲| 国产aⅴ综合色| 欧美日韩高清一区| 精品免费视频.| 成人欧美一区二区三区黑人麻豆| 亚洲激情一二三区| 久久精品国产亚洲高清剧情介绍| 成人av免费在线观看| 欧美二区乱c少妇| 中文字幕一区二| 激情文学综合网| 欧美美女bb生活片| 国产精品久久777777| 国产一区二区三区四区在线观看| 色琪琪一区二区三区亚洲区| 日韩一级视频免费观看在线| 亚洲视频一区在线| 日韩精品国产欧美| va亚洲va日韩不卡在线观看| 日韩欧美高清dvd碟片| 一区二区三区91| 一本色道久久综合狠狠躁的推荐| 国产日韩欧美麻豆| 丁香激情综合国产| 国产亚洲综合av| 国产成人av影院| 久久综合精品国产一区二区三区| 亚洲欧美激情在线| 91丨九色丨蝌蚪富婆spa| 国产人久久人人人人爽| 国产精品一区二区三区99| 精品乱人伦一区二区三区| 日韩成人精品在线| 日韩视频一区在线观看| 亚洲观看高清完整版在线观看| 成人永久看片免费视频天堂| 欧美一级精品大片| 亚洲女同一区二区| 99vv1com这只有精品| 精品1区2区在线观看| 日本中文一区二区三区| 91麻豆精品国产综合久久久久久| 免费成人性网站| 色94色欧美sute亚洲线路一ni| 国产日韩综合av| 大尺度一区二区| 国产丝袜欧美中文另类| 日本精品一区二区三区四区的功能| 国产性做久久久久久| 国产精品一区二区在线看| 国产精品久久久久7777按摩| 欧美日韩国产a| 国产精品自拍av| 一区二区在线看| 精品日产卡一卡二卡麻豆| 91美女视频网站| 国产精品系列在线观看| 天天av天天翘天天综合网色鬼国产| 国产日韩欧美a| 日韩欧美成人激情| 色婷婷av一区二区三区软件| 国产成人综合自拍| 日韩国产精品久久久| 亚洲激情图片一区| 26uuu欧美| 91精品国产品国语在线不卡| 欧美性色aⅴ视频一区日韩精品| 国精品**一区二区三区在线蜜桃| 一区二区三区日韩精品视频| 国产欧美日韩中文久久| 精品乱人伦小说| 日韩美女主播在线视频一区二区三区| 色狠狠桃花综合| 国产超碰在线一区| 国产精品白丝jk白祙喷水网站| 全部av―极品视觉盛宴亚洲| 天堂一区二区在线| 水蜜桃久久夜色精品一区的特点| 亚洲欧洲av另类| 亚洲综合视频网|