之前的作業,**中還有需要完善的地方,如記憶體管理等,先貼上實現**,後續會對紅黑樹的具體實現進行分析。
// author: sqxu
#include "stdafx.h"
#include using namespace std;
const int red=0;
const int black=1;
typedef struct rbtree
rbt; //定義結構體rbt
void leftrotate(rbt ** root, rbt * x); //左旋函式
void rightrotate(rbt ** root, rbt * x); //右旋函式
void rbinsertfixup(rbt ** root, rbt * z); //插入後的調整
void rbinsert(rbt ** root, rbt * z); //插入操作
void print(rbt * x); //列印乙個結點
void rbprint(rbt ** root); //列印一棵樹
int main()
for(int i=0; ikey = arrays[i]; //結點z的key值指向陣列中的元素
rbinsert(root, z); //將z指向的值插入到樹中
}cout<<"紅黑樹為:"if(x -> right != null && y != null)
x -> right = y -> left;
if(y != null && y -> left != null)
y -> left -> parent = x; //step2,y的左孩子與x的右孩子連線
if(y != null)
y -> parent = x -> parent;
if(x -> parent == null)
* root = y;
else
//step3,x的父結點作為y的父結點
if(y != null) }
void rightrotate(rbt ** root, rbt * x) //右旋函式
//step3,x的父結點作為y的父結點
if(y != null)
//step4,x與y交換
}void rbinsert(rbt ** root, rbt * z) //插入函式
z -> parent = y;
if(y == null)
* root = z;
else
//確定插入元素的位置
z -> left = null;
z -> right = null;
z -> color = red; //對插入點進行初始化
rbinsertfixup(root,z); //呼叫調整函式
}void rbinsertfixup(rbt ** root, rbt * z)
else //case2、case3
//case2轉換成case3
z -> parent -> color = black;
z -> parent -> parent->color = red;
rightrotate(root,z -> parent -> parent);}}
else //z的父結點為祖父結點的右孩子,操作同上
else
z -> parent -> color = black;
z -> parent -> parent -> color = red;
leftrotate(root,z -> parent -> parent);}}
}(*root)->color = black; }}
void print(rbt * x)
}
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹實現
紅黑樹 是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...