java语言实现红黑树 仅仅实现了插入算法
2016-10-13 18:01
567 查看
package cn.itcast.shujujiegou.tree; /** * Created by likailong on 2016/10/13. */ public class RedBlackTree<T extends Comparable<? super T>> { private RedBlackNode<T> header; private RedBlackNode<T> nullNode; private static final int RED=0; private static final int BLACK=1; public boolean isEmpty() { return header==nullNode; } private static class RedBlackNode <T>{ T element; int color; RedBlackNode<T> left; RedBlackNode<T> right; RedBlackNode(T theElement){ this(theElement,null,null); } RedBlackNode(T theElement,RedBlackNode<T> lt,RedBlackNode<T> rt){ element=theElement; left=lt; right=rt; color= RedBlackTree.BLACK; } } public RedBlackTree(){ nullNode=new RedBlackNode<T>(null); nullNode.left=nullNode.right=nullNode; header=new RedBlackNode<T>(null); header.left=header.right=nullNode; } private RedBlackNode<T> rotate(T item,RedBlackNode<T> parent){ if(compare(item,parent)<0) return parent.left=compare(item,parent.left)<0?rotateWithLeftChild(parent.left):rotateWithRightChild(parent.left); else return parent.right=compare(item,parent.right)<0?rotateWithLeftChild(parent.right):rotateWithRightChild(parent.right); } private RedBlackNode<T> rotateWithRightChild(RedBlackNode<T> k2) { RedBlackNode<T> k1=k2.right; k2.right=k1.left; k1.right=k2; return k1; } private RedBlackNode<T> rotateWithLeftChild(RedBlackNode<T> k2) { RedBlackNode<T> k1=k2.left; k2.left=k1.right; k1.right=k2; return k1; } private final int compare(T item,RedBlackNode<T> t ){ if(t==header) return 1; else return item.compareTo(t.element); } private RedBlackNode<T> current; private RedBlackNode<T> parent; private RedBlackNode<T> grand; private RedBlackNode<T> great; private void handleReorient(T item){ current.color=RED; current.left.color=BLACK; current.right.color=BLACK; if(parent.color==RED){ grand.color=RED; if((compare(item,grand)<0)!=(compare(item,parent)<0)) parent=rotate(item,grand); current=rotate(item,great); current.color=BLACK; } header.right.color=BLACK; } public void insert(T item){ current=parent=grand=header; nullNode.element=item; while (compare(item,current)!=0){ great=grand; grand=parent; parent=current; current=compare(item,current)<0?current.left:current.right; if(current.left.color==RED&¤t.right.color==RED){ handleReorient(item); } } if(current!=nullNode) return; current=new RedBlackNode<>(item,nullNode,nullNode); if(compare(item,parent)<0) parent.left=current; else parent.right=current; handleReorient(item);} public void printTree(){ if(isEmpty()){ System.out.println("tree is empty"); }else printTree(header.right); } private void printTree(RedBlackNode<T> t){ if(t!=nullNode){ printTree(t.left); System.out.println(t.element); printTree(t.right); } } }
相关文章推荐
- java语言实现红黑树 仅仅实现了插入算法
- java语言实现红黑树 仅仅实现了插入算法
- java语言实现红黑树 仅仅实现了插入算法
- java语言实现红黑树 仅仅实现了插入算法
- 红黑树实现(Java语言)
- 带权二分图的完备匹配算法(JAVA语言实现)
- 使用Spring Introducation 让Java类实现动态语言特性
- Strassen矩阵乘法(分治策略,java语言实现)
- 实现Java与C语言接口
- C#是一种新的语言?或者仅仅只是Java
- 75KB JAVA语言实现的流媒体服务器-milgra0.8b
- 用纯JAVA语言编程读取MAC地址的实现
- pl/x 语言语法分析器的java实现
- Java语言中链表和双向链表的实现
- JAVA 语言中链表和双向链表的实现
- 用贪心算法实现的背包问题(java语言)
- 红黑树的插入删除算法的实现(java描述)
- JAX-RPC简介(java语言实现方式)
- Java语言中链表和双向链表的实现
- 用纯JAVA语言实现读取MAC地址