`
- 浏览:
756436 次
-
-
packagecom.eshore.sweetop.dataframe;
-
importcom.eshore.sweetop.data.KeyData;
-
importcom.eshore.sweetop.data.Node;
-
importcom.eshore.sweetop.data.RBNode;
-
publicclassRBTree{
-
privateRBNoderoot;
-
privatestaticfinalRBNodeNIL=RBNode.getRBNode();
-
publicRBTree(){
- root=NIL;
- }
-
publicvoidinsert(RBNodenode){
- RBNodey=NIL;
- RBNodex=root;
-
while(x!=NIL){
- y=x;
-
if(node.getData().getKey()<x.getData().getKey()){
- x=x.getLeft();
-
}else{
- x=x.getRight();
- }
- }
- node.setParent(y);
-
if(y==NIL){
- root=node;
-
}elseif(node.getData().getKey()<y.getData().getKey()){
- y.setLeft(node);
-
}else{
- y.setRight(node);
- }
- node.setLeft(NIL);
- node.setRight(NIL);
- node.setColor(RBNode.RED);
-
node.setSize(1);
- addSize(node);
- insertFixup(node);
- }
-
privatevoidaddSize(RBNoderbn){
- rbn=rbn.getParent();
-
while(rbn!=NIL){
-
rbn.setSize(rbn.getSize()+1);
- rbn=rbn.getParent();
- }
- }
-
privatevoidremSize(RBNoderbn){
- rbn=rbn.getParent();
-
while(rbn!=NIL){
-
rbn.setSize(rbn.getSize()-1);
- rbn=rbn.getParent();
- }
- }
-
publicvoiddelete(RBNodenode){
- remSize(node);
- RBNodetempy=NIL,tempx=NIL;
-
if(node.getLeft()==NIL||node.getRight()==NIL){
- tempy=node;
-
}else{
- tempy=successor(node);
- }
-
if(tempy.getLeft()!=NIL){
- tempx=tempy.getLeft();
-
}else{
- tempx=tempy.getRight();
- }
- tempx.setParent(tempy.getParent());
-
if(tempy.getParent()==NIL){
- root=tempx;
-
}elseif(tempy==tempy.getParent().getLeft()){
- tempy.getParent().setLeft(tempx);
-
}else{
- tempy.getParent().setRight(tempx);
- }
-
if(tempy!=node){
- node.setData(tempy.getData());
- }
-
if(tempy.getColor()==RBNode.BLACK){
- deleteFixup(tempx);
- }
- }
-
privatevoiddeleteFixup(RBNodenode){
- RBNodetempw=NIL;
-
while(node!=root&&node.getColor()==RBNode.BLACK){
-
if(node==node.getParent().getLeft()){
- tempw=node.getParent().getRight();
-
if(tempw.getColor()==RBNode.RED){
- tempw.setColor(RBNode.BLACK);
- node.getParent().setColor(RBNode.RED);
- leftRotate(node.getParent());
- tempw=node.getParent().getRight();
- }
-
if(tempw.getLeft().getColor()==RBNode.BLACK&&tempw.getRight().getColor()==RBNode.BLACK){
- tempw.setColor(RBNode.RED);
- node=node.getParent();
-
}else{
-
if(tempw.getRight().getColor()==RBNode.BLACK){
- tempw.getLeft().setColor(RBNode.BLACK);
- tempw.setColor(RBNode.RED);
- rightRotate(tempw);
- }
- tempw.setColor(node.getParent().getColor());
- node.getParent().setColor(RBNode.BLACK);
- tempw.getRight().setColor(RBNode.BLACK);
- leftRotate(node.getParent());
-
break;
- }
-
}else{
- tempw=node.getParent().getLeft();
-
if(tempw.getColor()==RBNode.RED){
-
System.out.println("222");
- tempw.setColor(RBNode.BLACK);
- node.getParent().setColor(RBNode.RED);
- rightRotate(node.getParent());
- tempw=node.getParent().getLeft();
- }
-
if(tempw.getLeft().getColor()==RBNode.BLACK&&tempw.getRight().getColor()==RBNode.BLACK){
- tempw.setColor(RBNode.RED);
- node=node.getParent();
-
}else{
-
if(tempw.getLeft().getColor()==RBNode.BLACK){
- tempw.getRight().setColor(RBNode.BLACK);
- tempw.setColor(RBNode.RED);
- leftRotate(tempw);
- }
- tempw.setColor(node.getParent().getColor());
- node.getParent().setColor(RBNode.BLACK);
- tempw.getLeft().setColor(RBNode.BLACK);
- rightRotate(node.getParent());
-
break;
- }
- }
- }
- node.setColor(RBNode.BLACK);
- }
-
privatevoidleftRotate(RBNodenode){
- RBNodey=node.getRight();
- node.setRight(y.getLeft());
-
if(y.getLeft()!=NIL){
- y.getLeft().setParent(node);
- }
- y.setParent(node.getParent());
-
if(node.getParent()==NIL){
- root=y;
-
}elseif(node==node.getParent().getLeft()){
- node.getParent().setLeft(y);
-
}else{
- node.getParent().setRight(y);
- }
- y.setLeft(node);
- node.setParent(y);
- y.setSize(node.getSize());
-
node.setSize(node.getLeft().getSize()+node.getRight().getSize()+1);
- }
-
privatevoidrightRotate(RBNodenode){
- RBNodex=node.getLeft();
- node.setLeft(x.getRight());
-
if(x.getRight()!=NIL){
- x.getRight().setParent(node);
- }
- x.setParent(node.getParent());
-
if(node.getParent()==NIL){
- root=x;
-
}elseif(node==node.getParent().getLeft()){
- node.getParent().setLeft(x);
-
}else{
- node.getParent().setRight(x);
- }
- x.setRight(node);
- node.setParent(x);
- x.setSize(node.getSize());
-
node.setSize(node.getLeft().getSize()+node.getRight().getSize()+1);
- }
-
publicvoidinsertFixup(RBNodenode){
- RBNodey=NIL;
-
while(node.getParent().getColor()==RBNode.RED){
-
if(node.getParent()==node.getParent().getParent().getLeft()){
- y=node.getParent().getParent().getRight();
-
if(y.getColor()==RBNode.RED){
- node.getParent().setColor(RBNode.BLACK);
- y.setColor(RBNode.BLACK);
- node.getParent().getParent().setColor(RBNode.RED);
- node=node.getParent().getParent();
-
}else{
-
if(node==node.getParent().getRight()){
- node=node.getParent();
- leftRotate(node);
- }
- node.getParent().setColor(RBNode.BLACK);
- node.getParent().getParent().setColor(RBNode.RED);
- rightRotate(node.getParent().getParent());
- }
-
}else{
- y=node.getParent().getParent().getLeft();
-
if(y.getColor()==RBNode.RED){
- node.getParent().setColor(RBNode.BLACK);
- y.setColor(RBNode.BLACK);
- node.getParent().getParent().setColor(RBNode.RED);
- node=node.getParent().getParent();
-
}else{
-
if(node==node.getParent().getLeft()){
- node=node.getParent();
- rightRotate(node);
- }
- node.getParent().setColor(RBNode.BLACK);
- node.getParent().getParent().setColor(RBNode.RED);
- leftRotate(node.getParent().getParent());
- }
- }
- }
- root.setColor(RBNode.BLACK);
- }
-
publicvoidwalk(){
- walk(root);
- }
-
privatevoidwalk(RBNodenode){
-
if(node!=NIL){
- walk(node.getLeft());
-
System.out.println(node.getData()+":"+node.getColor());
- walk(node.getRight());
- }
- }
-
publicRBNodesearch(intk){
- RBNodenode=root;
-
while(node!=NIL&&k!=node.getData().getKey()){
-
if(k<node.getData().getKey()){
- node=node.getLeft();
-
}else{
- node=node.getRight();
- }
- }
-
returnnode;
- }
-
publicRBNodemin(RBNodenode){
-
while(node.getLeft()!=NIL){
- node=node.getLeft();
- }
-
returnnode;
- }
-
publicRBNodemin(){
-
returnmin(root);
- }
-
publicRBNodesuccessor(RBNodenode){
-
if(node.getRight()!=NIL){
-
returnmin(node.getRight());
- }
- RBNodey=node.getParent();
-
while(y!=NIL&&node==y.getRight()){
- node=y;
- y=y.getParent();
- }
-
returny;
- }
-
publicRBNodemax(RBNodenode){
-
while(node.getRight()!=NIL){
- node=node.getRight();
- }
-
returnnode;
- }
-
publicRBNodemax(){
-
returnmax(root);
- }
-
publicRBNodegetOSSelect(inti){
-
returngetOSSelect(root,i);
- }
-
publicRBNodegetOSSelect(RBNoderbn,inti){
-
intr=rbn.getLeft().getSize()+1;
-
if(i==r){
-
returnrbn;
-
}elseif(i<r){
-
returngetOSSelect(rbn.getLeft(),i);
-
}else{
-
returngetOSSelect(rbn.getRight(),i-r);
- }
- }
-
publicintgetOSRank(RBNodenode){
-
intr=node.getLeft().getSize()+1;
- RBNodetempy=node;
-
while(tempy!=root){
-
if(tempy==tempy.getParent().getRight()){
-
r=r+tempy.getParent().getLeft().getSize()+1;
- }
- tempy=tempy.getParent();
- }
-
returnr;
- }
-
publicstaticvoidmain(String[]args){
-
RBTreebt=newRBTree();
-
int[]id={1,2,14,8,15,6,3};
-
RBNodenode=null;
-
for(inti=0;i<id.length;i++){
-
node=newRBNode();
-
node.setData(newKeyData(id[i]));
- bt.insert(node);
- }
- bt.walk();
-
System.out.println("=====================");
-
System.out.println("Root"+bt.root.getData());
-
System.out.println("Max:"+bt.max().getData());
-
System.out.println("Min:"+bt.min().getData());
-
System.out.println(bt.search(8).getData());
-
System.out.println(bt.successor(bt.search(8)).getData());
-
bt.delete(bt.search(6));
-
-
-
System.out.println(bt.getOSSelect(4).getData());
-
System.out.println(bt.getOSRank(bt.search(8)));
- }
- }
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
算法 顺序统计量 期望线性 最坏线性
算法导论,第九章,chp9中位数和顺序统计量,C#和C++代码实现。
MIT算法导论公开课之课程笔记 顺序统计、中值.rar
数据结构的顺表表相关算法:C++顺序表,采用结构体的基本运算,采用数组的基本运算,顺序表基本运算。
本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通...
一本书的页码从自然数1开始顺序编码到自然数n。书的页码通常按照习惯编码,每个页码都不含多余的前导0.例如第6页用6表示而不用06表示或者006等。统计数字问题要求对给定的书的全部页码中分别用多少次数字0,1,2,.....
书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通...
我用Python写的一些算法 #算法 ##排序算法:sort文件夹下面 冒泡排序 插入排序 归并排序 ...动态顺序统计树 区间树 AVL树(未实现,类似于红黑树) Tries(用于处理字符串) B树(B树的中序遍历是由
本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通...
本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通...
书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通...
对于每种算法,程序都会统计缺页次数和缺页率。 对于FIFO页面置换算法,程序会将页面按照它们进入内存的顺序排列,并将最早进入内存的页面移除。如果某个页面不在内存中,程序就将其移入内存,并将其时间戳设置为0...
书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通...
书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通...
书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通...
本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通...
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的...
C语言全套资料 C语言程序设计 C语言算法 C语言课件 C语言顺序程序设计,C语言数组,C语言循环控制,C语言预处理命令,C语言文件操作指针,C语言选择结构程序设计,C语言结构体与共用体,C语言文件操作,C语言函数
14.1 动态顺序统计 14.2 如何扩张数据结构 14.3 区间树 思考题 本章注记 第四部分 高级设计和分析技术 第15章 动态规划 15.1 钢条切割 15.2 矩阵链乘法 15.3 动态规划原理 15.4 最长公共...
算法基本思想数组长度的时候,可以直接得到最大值和次大值数组长度大于2的时候,用递归的方法,将数组一分为二,算出左边数组的最大值和次大值,右边数组的最大值和