亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

數據結構 紅黑樹的詳解

2020-01-26 14:00:32
字體:
來源:轉載
供稿:網友

數據結構 紅黑樹的詳解

紅黑樹是具有下列著色性質的二叉查找樹:

1.每一個節點或者著紅色,或者著黑色。

2.根是黑色的。

3.如果一個節點是紅色的,那么它的子節點必須是黑色。

4.從一個節點到一個NULL指針的每一條路徑必須包含相同數目的黑色節點。

下面是一棵紅黑樹。


1.自底向上插入

通常把新項作為樹葉放到樹中。如果我們把該項涂成黑色,那么違反條件4,因為將會建立一條更長的黑節點路徑。因此這一項必須涂成紅色。如果它的父節點是黑色的,插入完成。如果父節點是紅色的,那么違反條件3。在這種情況下我們必須調整該樹以滿足條件3。用于完成這項目任務的基本操作是顏色的改變和樹的旋轉。

如果新插入的節點的父節點是黑色,那么插入完成。

如果父節點是紅色,那么有幾種情形需要考慮。首先,假設這個父節點的兄弟是黑色(NULL節點約定為黑色)。這對于插入3或8是適用的,但對插入99不適用。令X是新加的樹葉,P是它的父節點,S是該父節點的兄弟,G是祖父節點情況一:父節點的兄弟是黑色的。通過操作使得到達A,B,C的黑色路徑保持不變(滿足條件4),而且沒有連續的紅色節點(滿足條件3).。



情況二:父節點的兄弟是紅色的。



2.自頂向下刪除

紅黑樹中的刪除可以是自頂向下進行。每一件工作都歸結于能夠刪除一片樹葉。這是因為,要刪除一個帶有兩個兒子的節點,我們用右子樹上的最小節點代替它;該節點最多有一個兒子,然后將該節點刪除。只有一個右兒子的節點可以用相同的方式刪除,而只有一個左兒子的節點通過用其左子樹上最大的節點替換,然后可將該節點刪除。但是假如刪除的節點不是紅色的,那么就會破壞紅黑樹的平衡。解決的方法就是保證從上到下刪除期間樹葉是紅色的。

在整個討論中,令X為當前節點,T是它的兄弟,而P是它們的父親。開始時我們把根涂成紅色。當沿著樹向下遍歷時,我們設法保證X是紅色的。當我們到達一個新的節點時,我們要確信P是紅色的并且X和T是黑色的(因為不能有兩個相連的紅色節點)。存在兩種主要情形。
情況一:X有兩個黑色兒子。此時有三個子情況。
(1)T有兩個黑兒子,那么我們可以翻轉X、T、P的顏色來保持這種不變性。

(2)T的左兒子是紅色的

(3)T的右兒子是紅色的

情況二:X的兒子之一是紅的。在這種情況下,我們落到下一層,得到新的X、T、P。如果幸運,X落在紅兒子上。則我們繼續前行。如果不是這樣,那么我們知道T將是紅的,而X和P將是黑的。我們可以旋轉T和P,使得X的新父親是紅的;當然X和它的祖父是黑的。此時我們可以回到第一種主情況。

3.紅黑樹的實現
3.1 頭文件
// // RedBlackTree.h // RedBlackTree3 // // Created by Wuyixin on 2017/7/3. // Copyright © 2017年 Coding365. All rights reserved. //  #ifndef RedBlackTree_h #define RedBlackTree_h  #include <stdio.h> #include <stdlib.h> #include <limits.h>   typedef int ElementType;  typedef enum {  RED,  BLACK } COLOR;  typedef struct RedBlackNode *RedBlackTree,*Position;  struct RedBlackNode{  ElementType Element;  COLOR Color;  RedBlackTree Left;  RedBlackTree Right; };  static Position NullNode = NULL; static Position Header; static Position X,P,GP,GGP; /* 初始化 */ RedBlackTree Initialize(); /* 插入 */ RedBlackTree Insert(RedBlackTree T,ElementType Item); /* 刪除 */ RedBlackTree Remove(RedBlackTree T,ElementType Item); /* 查找 */ Position Find(RedBlackTree T,ElementType Item); /* 遍歷 */ void Travel(RedBlackTree T);     #endif /* RedBlackTree_h */ 

3.2 實現文件

// // RedBlackTree.c // RedBlackTree3 // // Created by Wuyixin on 2017/7/3. // Copyright © 2017年 Coding365. All rights reserved. //  #include "RedBlackTree.h"   /* 左旋轉 */ static Position SingleRotateLeft(Position X); /* 右旋轉 */ static Position SingleRotateRight(Position X); /* 旋轉 */ static Position Rotate(Position Parent,Position* Origin ,ElementType Item);   /* 左旋轉 */ static Position SingleRotateLeft(Position T){  Position TL = T->Left;  T->Left = TL->Right;  TL->Right = T;  return TL; } /* 右旋轉 */ static Position SingleRotateRight(Position T){  Position TR = T->Right;  T->Right = TR->Left;  TR->Left = T;  return TR; }  /* 旋轉 */ static Position Rotate(Position Parent,Position* Origin ,ElementType Item){  if (Item < Parent->Element){  if (Origin != NULL)   *Origin = Parent->Left;  return Parent->Left = Item < Parent->Left->Element ?  SingleRotateLeft(Parent->Left) :  SingleRotateRight(Parent->Left);  }  else{  if (Origin != NULL)   *Origin = Parent->Right;  return Parent->Right = Item < Parent->Right->Element ?  SingleRotateLeft(Parent->Right) :  SingleRotateRight(Parent->Right);  }  }   /* 初始化 */ RedBlackTree Initialize(){   if (NullNode == NULL){  NullNode = malloc(sizeof(struct RedBlackNode));  if (NullNode == NULL)   exit(EXIT_FAILURE);  NullNode->Element = INT_MAX;  NullNode->Color = BLACK;  NullNode->Left = NullNode->Right = NullNode;    }   Header = malloc(sizeof(struct RedBlackNode));  if (Header == NULL)  exit(EXIT_FAILURE);   /* header的值為無窮小,所以根插入到右邊*/  Header->Element = INT_MIN;  Header->Left = Header->Right = NullNode;  Header->Color = BLACK;   return Header;  }  static Position GetSibling(Position Parent,Position X){  if (Parent->Element == INT_MIN)  return NULL;  if (X == Parent->Left)  return Parent->Right;  else if (X == Parent->Right)  return Parent->Left;  else  return NULL; }  void HandleReorientForInsert(ElementType Item){  Position Sibling,Origin;   /* 當P與X同時為紅節點才進行調整 */  if (X == NullNode || !(P->Color == RED && X->Color == RED))  return ;    Sibling = GetSibling(GP, P);   if (Sibling == NULL)  return ;    /* GP,P,X是成字型,調整為一字型 */  if ((GP->Element < Item) != (P->Element < Item)){  P = Rotate(GP, &Origin,Item);  X = Origin;  }   GP = Rotate(GGP, &Origin,Item);  P = Origin;   /* P的兄弟是黑色的 */  if (Sibling->Color == BLACK){    GP->Color = BLACK;  GP->Left->Color = RED;  GP->Right->Color = RED;    }  /* P的兄弟是紅的 */  else{    GP->Color = RED;  GP->Left->Color = BLACK;  GP->Right->Color = BLACK;  } }  RedBlackTree _Insert(RedBlackTree T,ElementType Item){   if (T == NullNode){  T = malloc(sizeof(struct RedBlackNode));  T->Element = Item;  T->Left = T->Right = NullNode;  T->Color = RED;  }  else if (Item < T->Element)  T->Left = _Insert(T->Left, Item);  else if (Item > T->Element)  T->Right = _Insert(T->Right, Item);  /* 重復值不插入 */   X = P,P = GP,GP = GGP, GGP = T;   HandleReorientForInsert(Item);   return T; }  /* 插入 */ RedBlackTree Insert(RedBlackTree T,ElementType Item){  GGP = GP = P = X = NullNode;  T = _Insert(T, Item);  T->Right->Color = BLACK;  return T; }   static void _HandleReorientForRemove(ElementType Item){  RedBlackTree Sibling,R;  Sibling = GetSibling(P, X);   if (Sibling == NULL)  return ;   if (Sibling->Left->Color == BLACK && Sibling->Right->Color == BLACK){  P->Color = BLACK;  X->Color = RED;  Sibling->Color = RED;  }else if(Sibling->Left->Color == RED){  R = Sibling->Left;    P->Color = BLACK;  X->Color = RED;    R = Rotate(P, NULL, R->Element);  GP = Rotate(GP, NULL, R->Element);    }else if (Sibling->Right->Color == RED){  X->Color = RED;  P->Color = BLACK;  Sibling->Color = RED;  Sibling->Right->Color = BLACK;    GP = Rotate(GP, NULL, Sibling->Element);    } }  static void HandleReorientForRemove(RedBlackTree T, ElementType Item){  RedBlackTree Sibling,Origin,OriginGP;  if (X == NullNode)  return ;   /* X有兩個黑兒子 */  if (X->Left->Color == BLACK && X->Right->Color == BLACK){  _HandleReorientForRemove(Item);  }else{    OriginGP = GP;  /* 落到下一層 */  GP = P; P = X;    if (Item < X->Element)   X = X->Left;  else   X = X->Right;      Sibling = GetSibling(P, X);  /* 如果X是黑的,則Sibling是紅的,旋轉 */  if (X->Color == BLACK){   GP = Rotate(GP, &Origin, Sibling->Element);   P = Origin;   GP->Color = BLACK;   P->Color = RED;   _HandleReorientForRemove(Item);    }    /* 恢復X,PX,GP。由于X是當前節點 如果當前節點正是Item,不恢復會影響查找 */  if (X->Element == Item){   X = P ; P = GP ;GP = OriginGP;  }    } }  /* 刪除 */ RedBlackTree Remove(RedBlackTree T,ElementType Item){   ElementType Origin;  Position DeletePtr;  Origin = NullNode->Element;   NullNode->Element = Item;   GP = P = X = T;   /* 根染紅 */  T->Right->Color = RED;   while (X->Element != Item) {  GP = P ; P = X;  if (Item < X->Element)   X = X->Left;  else   X = X->Right;    HandleReorientForRemove(T, Item);  }    NullNode->Element = Origin;   /* 找到 */  if (X != NullNode){  DeletePtr = X;   if (X->Left != NullNode){   GP = P ; P = X; X = X->Left;   HandleReorientForRemove(T, Item);   /* 尋找左子樹最大值替換 */   while (X->Right != NullNode) {   GP = P ; P = X;   X = X->Right;   HandleReorientForRemove(T, Item);   }   if (X == P->Left)   P->Left = X->Left;   else   P->Right = X->Left;    }else if (X->Right != NullNode){   GP = P ; P = X; X = X->Right;   HandleReorientForRemove(T, Item);   /* 尋找右子樹最大值替換 */   while (X->Left != NullNode) {   GP = P ; P = X;   X = X->Left;   HandleReorientForRemove(T, Item);   }   if (X == P->Left)   P->Left = X->Right;   else   P->Right = X->Right;  }else{   /* X是樹葉 */   if (X == P->Left)   P->Left = NullNode;   else   P->Right = NullNode;  }    DeletePtr->Element = X->Element;  free(X);    }   /* 根染黑 */  T->Right->Color = BLACK;   return T; }    typedef enum {  ROOT,  LEFT,  RIGHT } NodeType;  static char *TypeC; static char *ColorC;  void _Travel(RedBlackTree T , NodeType Type){   if (T != NullNode){    if (Type == ROOT)   TypeC = "root";  else if (Type == LEFT)   TypeC = "left";  else if (Type == RIGHT)   TypeC = "right";    if (T->Color == BLACK)   ColorC = "black";  else   ColorC = "red";    printf("(%d,%s,%s) ",T->Element,ColorC,TypeC);    _Travel(T->Left, LEFT);  _Travel(T->Right, RIGHT);    }  }  /* 遍歷 */ void Travel(RedBlackTree T){  _Travel(T->Right,ROOT); } 

3.3 調用

// // main.c // RedBlackTree3 // // Created by Wuyixin on 2017/7/3. // Copyright © 2017年 Coding365. All rights reserved. //  #include "RedBlackTree.h" int main(int argc, const char * argv[]) {      RedBlackTree T = Initialize();      T = Insert(T, 10);   T = Insert(T, 85);   T = Insert(T, 15);   T = Insert(T, 70);   T = Insert(T, 20);   T = Insert(T, 60);   T = Insert(T, 30);   T = Insert(T, 50);   T = Insert(T, 65);   T = Insert(T, 80);   T = Insert(T, 90);   T = Insert(T, 40);   T = Insert(T, 5);   T = Insert(T, 55);   T = Insert(T, 100);         T = Remove(T, 100);         Travel(T);         return 0; } 

以上就是關于數據結構與算法中紅黑二叉樹的詳解,如有疑問請留言或者到本站的社區討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线免费| 亚洲最新中文字幕| 国产精品91免费在线| www.欧美视频| 欧美成人亚洲成人| 久久精品国产久精国产一老狼| 精品国产区一区二区三区在线观看| 欧美性猛交xxxx乱大交3| 亚洲乱码国产乱码精品精| 92福利视频午夜1000合集在线观看| 国产精品丝袜久久久久久高清| 国产精品一区=区| 国产精品露脸自拍| 亚洲免费视频网站| 日本国产高清不卡| 久久久久久久激情视频| 中文精品99久久国产香蕉| 成人激情视频在线播放| 欧美一区二区三区……| 久久国产精品久久久久久| 亚洲缚视频在线观看| 亚洲视频精品在线| 青青在线视频一区二区三区| 国产精品6699| 狠狠爱在线视频一区| 成人疯狂猛交xxx| 午夜精品视频在线| 国产成人精品日本亚洲专区61| 欧美黑人极品猛少妇色xxxxx| 一个人看的www欧美| 国产精品第七影院| 91wwwcom在线观看| 成人有码在线视频| 精品国产一区二区三区久久久狼| 亚洲成人激情在线| 亚洲国产女人aaa毛片在线| 欧美一级大片在线免费观看| 97久久国产精品| 欧美肥老妇视频| 国产精品高清免费在线观看| 欧美大尺度在线观看| 国产噜噜噜噜噜久久久久久久久| 国产视频欧美视频| 欧美久久精品一级黑人c片| 欧美在线观看日本一区| 精品国产电影一区| 国产一区二区三区网站| 亚洲电影免费在线观看| 成人亲热视频网站| 中文字幕在线观看亚洲| 中文字幕在线日韩| 国产成人精品一区二区三区| 日韩大陆欧美高清视频区| 久久91精品国产| 一区二区成人av| 亚洲最大成人免费视频| 91精品国产综合久久香蕉| 2019最新中文字幕| 2019中文字幕在线| 国产一区私人高清影院| 91免费电影网站| 亚洲在线视频福利| 国内精品视频在线| 久热精品视频在线免费观看| 亚洲aⅴ男人的天堂在线观看| 亚洲精品国产欧美| 亚洲va码欧洲m码| 欧美日韩另类在线| 26uuu另类亚洲欧美日本老年| 国产美女久久精品香蕉69| 亚洲性生活视频在线观看| 欧美国产视频日韩| 热草久综合在线| 午夜精品福利视频| 精品人伦一区二区三区蜜桃免费| 亚洲自拍偷拍视频| 国产成人精品在线观看| 日韩精品黄色网| 亚洲第一精品久久忘忧草社区| 国产欧美日韩视频| 国产成人高清激情视频在线观看| 国产97人人超碰caoprom| 97在线视频免费| 成人免费在线视频网址| 欧美国产日韩一区二区三区| 亚洲人成网站免费播放| 日韩免费在线免费观看| 伊是香蕉大人久久| 一本色道久久综合狠狠躁篇怎么玩| 一区二区成人精品| 久久视频这里只有精品| 亚洲qvod图片区电影| 在线看欧美日韩| 欧美精品久久久久久久久久| 久久97精品久久久久久久不卡| 精品久久久在线观看| 国产一区二区动漫| 国产精品一区av| 九九九热精品免费视频观看网站| 亚洲毛片在线观看.| 97在线观看视频国产| 欧美日韩在线视频观看| 亚洲精品wwww| 欧美成人免费视频| 成人黄色免费网站在线观看| 国产精品女人久久久久久| 粉嫩av一区二区三区免费野| 91av视频在线免费观看| 日韩在线视频导航| 亚洲 日韩 国产第一| 久久亚洲精品小早川怜子66| 亚洲女人被黑人巨大进入al| 两个人的视频www国产精品| 亚洲丝袜av一区| 亚洲在线免费看| 亚洲精品久久久久中文字幕欢迎你| 亚洲欧美日本伦理| 欧美专区国产专区| 亚洲永久在线观看| 日韩成人av网| 97精品国产91久久久久久| 日韩av电影在线网| 日韩精品在线免费| 91在线视频精品| www.久久久久| 久久免费视频观看| 91精品中文在线| 欧美日韩不卡合集视频| 高清欧美一区二区三区| 国产精品美女久久| 欧美一二三视频| 久久综合免费视频影院| 欧美整片在线观看| 国产亚洲激情视频在线| 久久人人爽亚洲精品天堂| 久久91亚洲精品中文字幕奶水| 亚洲偷熟乱区亚洲香蕉av| 成人激情在线播放| 精品欧美aⅴ在线网站| 日韩中文字幕免费视频| 国产亚洲精品久久久优势| 欧美黑人xxx| 91精品免费视频| 精品高清美女精品国产区| 中文字幕国内精品| 久久久国产精品免费| 91福利视频网| 国产欧美一区二区三区视频| 欧美一级淫片videoshd| 欧美猛交免费看| 最新国产成人av网站网址麻豆| 国产欧亚日韩视频| 欧美日韩高清在线观看| 久热精品视频在线观看一区| 亚洲精品不卡在线| 日韩在线播放视频| 91精品免费视频| 欧美亚洲国产视频小说| 啊v视频在线一区二区三区| 日韩欧美aⅴ综合网站发布| 国产精品欧美一区二区三区奶水| 亚洲成avwww人| 亚洲激情视频在线播放| 亚洲成人av片|