紅黑樹的實現

2021-07-22 01:25:20 字數 3079 閱讀 5505

學了一下演算法導論上的紅黑樹,這個資料結構基於二叉搜尋樹,二叉搜尋樹有乙個缺點:如果資料以遞增的順序插入,得到的樹深度就是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。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...