#include #includeusing namespace std;
typedef struct listlist, *plist;
plist build_cirle_list(int n)//建立單向迴圈鍊錶
pp->next=head;
return head;
}void josephus_permutation(plist & pl,int m)//josephus 排列
} coutpt->next=pp->next;
delete pp;//刪除已經訪問過的元素
pp=pt;//重置pp為已訪問元素的上乙個指標
} coutn=100,m=20;
cout<
#include#include #include using namespace std;
typedef struct rb_noderb_node,*prbnode;
prbnode nil;//所有結點的公共黑色結點,類似於null
void binary_tree_left_rotation(prbnode &pn,prbnode y)//二叉搜尋樹左旋
x->parent=y->parent;
if(y->parent==nil)else if(y==y->parent->left)else
x->left=y;
y->parent=x;
x->size=y->size;//更新相應結點值
y->size=y->left->size+y->right->size+1;
}void binary_tree_right_rotation(prbnode &pn,prbnode x)//二叉搜尋樹右旋
y->parent=x->parent;
if(x->parent==nil)else if(x==x->parent->left)else
y->right=x;
x->parent=y;
y->size=x->size;//更新相應的size值
x->size=x->left->size+x->right->size+1;
}void rb_tree_insert_fixup(prbnode &pn,prbnode pz)//紅黑結點修復
else
pz->parent->rb=0; //case three
pz->parent->parent->rb=1;
binary_tree_right_rotation(pn,pz->parent->parent);
}}elseelse
pz->parent->rb=0;//case three
pz->parent->parent->rb=1;
binary_tree_left_rotation(pn,pz->parent->parent);
}
} pn->rb=0; }}
void binary_tree_insert(prbnode &pn,prbnode pz)
else
} if(y==nil)else if(pz->value<=y->value)else
pz->parent=y;
rb_tree_insert_fixup(pn,pz);//插入結點後可能會破壞紅黑樹的性質,
}void build_binary_search_tree(prbnode &pn,int n)//建立n個具有父節點的二叉搜尋樹
; for(int i=0;ileft=nil;
ptmp->right=nil;
ptmp->parent=nil;
ptmp->value=/*a[i]*//*value*/i+1;
ptmp->rb=1;//紅結點
ptmp->size=1;
//coutcoutinorder(pn->right); }}
prbnode binary_tree_search(prbnode pn,int key)//二叉搜尋樹查詢
else
} return pp;
}prbnode binary_tree_maximum(prbnode pn)//最大值
return pn;
}prbnode binary_tree_minimux(prbnode pn)//最小值
return pn;
}prbnode binary_tree_successor(prbnode pz)//後繼結點
prbnode p=pz->parent;//父親節點
while(p!=nil && pz==p->right)
return p;
}prbnode binary_tree_predecessor(prbnode pz)
prbnode p=pz->parent;
while(p!=nil && pz==p->left)
return p;
}void rb_transplant(prbnode &pn,prbnode u,prbnode v)//紅黑樹刪除操作輔助程式
else if(u==u->parent->left)else
v->parent=u->parent;
}void rb_delete_fixup(prbnode &pn,prbnode px)//紅黑樹 刪除操作修正
if(pw->left->rb==0 && pw->right->rb==0)
else
pw->rb=px->parent->rb;
px->parent->rb=0;
pw->right->rb=0;
binary_tree_left_rotation(pn,px->parent);
px=pn;
}}else
if(pw->left->rb==0 && pw->right->rb==0)else
pw->rb=px->parent->rb;
px->parent->rb=0;
pw->left->rb=0;
binary_tree_right_rotation(pn,px->parent);
px=pn;
}} }
px->rb=0;
}void rb_delete(prbnode &pn,prbnode pz)
else if(pz->right==nil)elseelse
rb_transplant(pn,pz,py);
py->left=pz->left;
py->left->parent=py;
py->rb=pz->rb;
py->size=py->left->size+py->right->size+1;//修改新結點的size值
} while (ptm!=nil)
delete pz;
if(0==y_org_color)
}prbnode os_select(prbnode pn,int i)//選擇紅黑樹中的第i個元素
else if(ileft,i);
}else
}int os_rank(prbnode pn,prbnode pz)//求紅黑樹中pz的秩
pz=pz->parent;
} return r;
}prbnode os_successor(prbnode pn,prbnode pz,int i)//確定pz的第i個後繼
void josephus_permutation(prbnode &pn,int n,int m)
coutnil->right=nil;
nil->rb=0;//黑色
nil->parent=nil;
nil->value=numeric_limits::min();
nil->size=0;//nil結點大小為0
prbnode pn=nil;
int m=20;
build_binary_search_tree(pn,n);
cout<
紅黑樹實現
紅黑樹 是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...
紅黑樹實現
按演算法導論裡的偽 用c 實現了紅黑樹。實現過程中,參考了nginx的紅黑樹實現,特別是右旋的實現,演算法導論裡沒有給出,就借鑑了nginx的實現。對比了nginx的紅黑樹實現和演算法導論裡的偽 插入基本上一樣的,刪除兩者有點差別,但思路應該是一樣的。實現過程中需要注意的是,空葉子結點一定要實現,不...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...