Josephus排列 紅黑樹實現 鍊錶實現

2021-06-20 17:22:23 字數 4059 閱讀 9123

#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.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...