1. 程式人生 > >紅黑樹的插入建立(左旋 右旋)

紅黑樹的插入建立(左旋 右旋)

紅黑樹是每個節點都帶有顏色屬性的二叉查詢樹,顏色或紅色或黑色。除了二叉查詢樹的性質,同時還有以下的五大性質: 性質1. 節點是紅色或黑色。 性質2. 根節點是黑色。 性質3 每個葉節點(NIL節點,空節點)是黑色的。 性質4 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點) 性質5. 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。          建立紅黑樹是在建立二叉查詢樹的基礎上進行調整得到的         由於也是勉強理解 需要寫下自己的見解以免忘記

typedefstruct node{

    int key,color;

    struct node *lchild;

    struct node *rchild;

    struct node *parent;

}Pnode;

結構體型別就是在二叉搜尋樹的基礎上增加了color這個變數

插入操作:

插入的元素預設為紅色

除了基本的二叉樹元素插入之外還增加了紅黑調整滿足紅黑樹的五大性質

        假設插入節點為X,無論哪種插入情況只會影響性質2和性質4其中的一個.

1.當紅黑樹為空樹時,此時只需將插入的元素作為根節點並把顏色改成黑色即可

2.當紅黑樹不為空時,當且僅當插入後,X的父節點與X一樣為紅色時,違反性質4。

一.當X的叔叔節點(即X的父親的兄弟節點)為紅色時, 將X的爺爺節點改為紅色,將X的父節點和叔叔節點改為黑色,並將X的爺爺節點進入下一次調整。

二.當X的叔叔節點為黑色時,如果X為其父節點的左孩子,將其父節點改為黑色,將爺爺節點改成紅色並對爺爺節點進行右旋。

三.當X的叔叔節點為黑色時,如果X為其父節點的右孩子,對其父節點進行左旋,再進行第二種情況操作。

程式碼:

//插入

void insert(Pnode **root,int x)

{

    Pnode *p=(Pnode *)malloc(sizeof(Pnode));

    p->lchild=p->rchild=p->parent=NULL;

    p->color=red;p->key=x;

//如果為空樹違反性質2 因此直接將紅色改成黑色即可

    if(*root==NULL) {

        p->color=black;

        *root=p;

        return;

   }

    if((*root)->rchild==NULL&&(*root)->key

<x){

        (*root)->rchild=p;

       p->parent=*root;

        insertfix(&p);

        return;

   }

    if((*root)->lchild==NULL&&(*root)->key>x){

        (*root)->lchild=p;

       p->parent=*root;

        insertfix(&p);

        return;

    }

    if((*root)->key<x){

        insert(&(*root)->rchild,x);

    }

    else {

        insert(&(*root)->lchild,x);

    }

}

//插入調整

void insert(Pnode **root,int x)

{

   Pnode *p=(Pnode *)malloc(sizeof(Pnode));

    p->lchild=p->rchild=p->parent=NULL;

    p->color=red;p->key=x;

//如果為空樹違反性質2 因此直接將紅色改成黑色即可

    if(*root==NULL) {

        p->color=black;

        *root=p;

        return;

    }

   if((*root)->rchild==NULL&&(*root)->key<x){

        (*root)->rchild=p;

        p->parent=*root;

        insertfix(&p);

        return;

    }

    if((*root)->lchild==NULL&&(*root)->key>x){

        (*root)->lchild=p;

        p->parent=*root;

        insertfix(&p);

        return;

    }

    if((*root)->key<x){

        insert(&(*root)->rchild,x);

    }

    else {

        insert(&(*root)->lchild,x);

    }

}