红黑树

package datastructure.tree;

/**
 * 红黑树是基于平衡二叉搜索树的一种扩展,它是给据红黑结点来判断是否旋转并进行相应的处理
 * 这样就省去了平衡因子的判断,简化了算法的难度。根据红黑结点以调整树的平衡因子,这种 方
 * 法可以近似平衡。红黑树具有以下性质:
 *  1.每个结点要么是黑色,要么是红色。(源于算法导论第三版)
 *  2.根结点是黑色的。
 *  3.每个叶节点是黑色的(NIL)
 *  4.如果一个结点是红色的,则它的两个子结点都是黑色的。
 *  5.对于每个结点,从该结点到其所有后代的叶结点的简单路径上,均包含相同数目的黑色结点。
 *  
 * 两种旋转:
 *     右旋: 给据中序遍历的规律,将旋转点移到右孩子上,左孩子提升为父节点。
 *     左旋:同样是的规律,将旋转点旋转到左孩子,右孩子提升为父节点。
 *   关于父节点下面的孩子,给据中序遍历的规律,可以判断各孩子的节点的位置变化。
 *   注意:只会影响到孩子的孩子。不会超过三层,这样旋转就变得简单了。
 * 应用:
 *   在JAVA中,TreeSet是TreeMap实现的,TreeMap就是红黑树实现的。
 *   由于它具有快速删除,快速查找,其效率为O(logn),使用它比较适合需要排序
 *   的对象。使用TreeSet作为 容器时,自定义的类型就需要实现Comparable
 *   接口,否则插入两个以上就会 抛出异常。里面有CompareTo方法,实现自己相应
 *   的排序规则就行了。
 *date structure
 *@author ZXLS
 *@date 2014年12月1日
 *@version 1.7
 */
public class RedBlackTree {
	static class Node{
		Node left;
		Node right;
		Node parent;
		int key;
		int color;
		public Node(int key){
			this.key=key;
		}
		@Override
		public String toString() {
			return "<"+key+","+(color==1?"Red":"BLACK")+">";
		}
	}
	static class Tree{
		public static Node nil=null;
		public static final int RED=1;
		public static final int BLACK=2;
		Node root;
	}
	/**
	 * 插入树
	 * @param t
	 * @param z
	 */
	public void RBInsert(Tree t,Node z){
		Node y=Tree.nil;
		Node x=t.root;
		while(x!=Tree.nil){
			y=x;
			if(z.key

你可能感兴趣的:(Java,数据结构,数据结构,算法导论,structure,java)