- package com.eshore.sweetop.dataframe;
- import com.eshore.sweetop.data.KeyData;
- import com.eshore.sweetop.data.Node;
- import com.eshore.sweetop.data.RBNode;
- public class RBTree {
- private RBNode root;
- private static final RBNode NIL = RBNode.getRBNode();
- public RBTree() {
- root = NIL;
- }
- public void insert(RBNode node) {
- RBNode y = NIL;
- RBNode x = 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;
- } else if (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);
- }
- public void delete(RBNode node) {
- RBNode tempy=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;
- } else if (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);
- }
- }
- private void deleteFixup(RBNode node){
- 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);
- }
- private void leftRotate(RBNode node) {
- RBNode y = node.getRight();
- node.setRight(y.getLeft());
- if (y.getLeft() != NIL) {
- y.getLeft().setParent(node);
- }
- y.setParent(node.getParent());
- if (node.getParent() == NIL) {
- root = y;
- } else if (node == node.getParent().getLeft()) {
- node.getParent().setLeft(y);
- } else {
- node.getParent().setRight(y);
- }
- y.setLeft(node);
- node.setParent(y);
- }
- private void rightRotate(RBNode node) {
- RBNode x = node.getLeft();
- node.setLeft(x.getRight());
- if (x.getRight() != NIL) {
- x.getRight().setParent(node);
- }
- x.setParent(node.getParent());
- if (node.getParent() == NIL) {
- root = x;
- } else if (node == node.getParent().getLeft()) {
- node.getParent().setLeft(x);
- } else {
- node.getParent().setRight(x);
- }
- x.setRight(node);
- node.setParent(x);
- }
- public void insertFixup(RBNode node) {
- RBNode y = 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);
- }
- public void walk() {
- walk(root);
- }
- private void walk(RBNode node) {
- if (node != NIL) {
- walk(node.getLeft());
- System.out.println(node.getData() + ":" + node.getColor());
- walk(node.getRight());
- }
- }
- public RBNode search(int k) {
- RBNode node = root;
- while (node != NIL && k != node.getData().getKey()) {
- if (k < node.getData().getKey()) {
- node = node.getLeft();
- } else {
- node = node.getRight();
- }
- }
- return node;
- }
- public RBNode min(RBNode node) {
- while (node.getLeft() != NIL) {
- node = node.getLeft();
- }
- return node;
- }
- public RBNode min() {
- return min(root);
- }
- public RBNode successor(RBNode node) {
- if (node.getRight() != NIL) {
- return min(node.getRight());
- }
- RBNode y = node.getParent();
- while (y != NIL && node == y.getRight()) {
- node = y;
- y = y.getParent();
- }
- return y;
- }
- public RBNode max(RBNode node) {
- while (node.getRight() != NIL) {
- node = node.getRight();
- }
- return node;
- }
- public RBNode max() {
- return max(root);
- }
- public static void main(String[] args) {
- RBTree bt = new RBTree();
- int[] id = { 1, 2, 14, 8, 15, 6, 3 };
- RBNode node = null;
- for (int i = 0; i < id.length; i++) {
- node = new RBNode();
- node.setData(new KeyData(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 发布