算法之红黑树
Posted 吴冬冬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法之红黑树相关的知识,希望对你有一定的参考价值。
- 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();
以上是关于算法之红黑树的主要内容,如果未能解决你的问题,请参考以下文章