學了一下演算法導論上的紅黑樹,這個資料結構基於二叉搜尋樹,二叉搜尋樹有乙個缺點:如果資料以遞增的順序插入,得到的樹深度就是n,進行操作就很不方便。紅黑樹就是在此基礎上完善,自己可以自平衡,使兩邊始終保持接近,這樣時間複雜度就降到o(lgn)。這個資料結構的確很難,插入和刪除這兩種操作非常複雜,自己按照書上給的偽**實現了一下,思路是基本理清了,這種太複雜的資料結構想完全記住是不太現實的,能夠掌握要點,下次看的時候可以馬上回憶起來就可以了。
標頭檔案:
#ifndef _red_black_tree_
#define _red_black_tree_
#define red 82
#define black 66
typedef struct rbtreenode
node,*rbtree;
typedef struct rbroot
rbroot;
rbroot *createtree();
void inserttree(rbroot *tree, int key);
void deletenode(rbroot *tree, node *z);
void printtree(rbroot *tree);
#endif
函式宣告檔案:
#include#include#include"rbtree.h"
static void leftrotate(rbroot *tree, node *x);
static void rightrotate(rbroot *tree, node *y);
static void rbinsertfixup(rbroot *tree, node *z);
static void printnode(node *node,int key, int direction);
static void insertnode(rbroot *tree, node *z);
static void rbtransplant(rbroot *tree, node *u, node *v);
static void rbdeletefixup(rbroot *tree, node *x);
rbroot *createtree()
static void leftrotate(rbroot *tree, node *x)
static void rightrotate(rbroot *tree, node *y)
static void rbinsertfixup(rbroot *tree, node *z)
else if (z == z->pre->right)//叔為黑且自己為右子樹就進行一次左旋轉換為第三種情況(叔不存在也是黑)
else//將父親和爺爺的顏色交換並對爺爺進行一次右旋,這樣轉換為第一種情況
}else//父親為右子樹的情況只要把上面的情況中所以right和left互換就行
else if (z == z->pre->left)
else
}} tree->root->color = black;//將根結點設為黑色
}static void insertnode(rbroot *tree, node *z)
z->pre = y;
if (y == null)
tree->root = z;
else if (z->key < y->key)
y->left = z;
else
y->right = z;
z->left = null;
z->right = null;
z->color = red;
rbinsertfixup(tree, z);
}static void printnode(node *node,int key, int direction)
}void printtree(rbroot *tree)
void inserttree(rbroot *tree, int key)
void rbtransplant(rbroot *tree, node *u, node *v)//用v來取代u
void rbdeletefixup(rbroot *tree, node *x)
else
else if (w->right->color == black)//情況3:兄弟的左孩子紅右孩子黑,右旋一次轉換為情況4
else//情況4:兄弟的孩子都是紅色,此時坐旋使原x的路徑增加乙個黑色,這種情況出現說明完成紅黑平衡
}} else
else
else if (w->left->color == black)//情況3:兄弟的左孩子紅右孩子黑,右旋一次轉換為情況4
else//情況4:兄弟的孩子都是紅色,此時坐旋使原x的路徑增加乙個黑色,這種情況出現說明完成紅黑平衡
}} }
x->color = black;
}void deletenode(rbroot *tree,node *z)
else if (z->right == null)
else
rbtransplant(tree, z, y);
y->left = z->left;
y->left->pre = y;
y->color = z->color;
} if (origin_color == black)
rbdeletefixup(tree, x);
}
實現檔案:#include#include#include"rbtree.h"
int main()
; rbroot* tree = createtree();
for (int i = 0; i < sizeof(test)/sizeof(int); i++)
inserttree(tree, test[i]);
printtree(tree);
deletenode(tree,tree->root);
printtree(tree);
return 0;
}
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹實現
紅黑樹 是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...