- 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);
- insertFixup(node);
- }
- publicvoiddelete(RBNodenode){
- 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){
- RBNode tempw=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);
- }
- 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);
- }
- 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);
- }
- 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(2));
- System.out.println("Root"+bt.root.getData());
- bt.walk();
- }
- }
算法之红黑树
最新推荐文章于 2022-05-10 15:58:38 发布