基于Java代码的红黑树简单实现

直接上代码

public class RedBlackTree<Key extends Comparable<Key>, Value> {

	/** 根节点 */
	private Node root;
	
	/** 节点数 */
	private int n;
	
	private static boolean RED = true;
	
	private static boolean BLACK = false;
	
	/**
	 * 节点类定义
	 */
	public class Node{
		public Key key;
		public Value value;
		public Node left;
		public Node right;
		public boolean color;
		public Node(Key key, Value value, Node left, Node right, boolean color) {
			super();
			this.key = key;
			this.value = value;
			this.left = left;
			this.right = right;
			this.color = color;
		}
	}
	
	public int size(){
		return n;
	}
	
	//节点是否为红色
	private boolean isRed(Node node){
		return node != null && node.color;
	}
	
	//左旋
	private Node rotateLeft(Node node){
		//1.获取node节点的右子节点  记作 rNode
		Node rNode = node.right;
		//2.让rNode节点的左子节点变为node节点的右子节点
		rNode.right = node.left;
		//3.让node节点变为rNode节点的左子节点
		rNode.left = node;
		//4.让rNode的color属性变为node的color属性
		rNode.color = node.color;
		//5.让node节点的color属性变为red
		node.color = RED;
		return rNode;
	}
	
	//右旋
	private Node rotateRight(Node node){
		//1.获取node节点的左子节点  记作 lNode
		Node lNode = node.left;
		//2.让node节点的左子节点变为lNode节点的右子节点
		node.left = lNode.right;
		//3.让node节点变为lNode节点的右子节点
		lNode.right = node;
		//4.让lNode的color属性变为node的color属性
		lNode.color = node.color;
		//5.让node节点的color属性变为red
		node.color = RED;
		return lNode;
	}
	
	//颜色反转
	private void flipColor(Node node){
		node.color = RED;
		node.left.color = BLACK;
		node.right.color = BLACK;
	}
	
	/**
	 * 添加
	 */
	public void put(Key key, Value value){
		root = put(root, key, value);
		if(root != null) root.color = BLACK;
	}
	
	/**
	 * 添加数据到指定节点下
	 */
	private Node put(Node node, Key key, Value value){
		if(node == null){
			n ++;
			return new Node(key, value, null, null, RED);
		}
		//比较key
		int compareTo = key.compareTo(node.key);
		if(compareTo < 0){
			node.left = put(node.left, key, value);
		}else if(compareTo > 0){
			node.right = put(node.right, key, value);
		}else{
			node.value = value;
		}
		//是否需要左旋
		if(!isRed(node.left) && isRed(node.right))
			node = rotateLeft(node);
		//是否需要右旋
		if(isRed(node.left) && isRed(node.left.left))
			node = rotateRight(node);
		//是否需要颜色反转
		if(isRed(node.left) && isRed(node.right))
			flipColor(node);
		return node;
	}
	
	/**
	 * 获取
	 */
	public Value get(Key key){
		return get(root, key);
	}
	
	private Value get(Node node, Key key){
		if(node == null) return null;
		int compareTo = key.compareTo(node.key);
		if(compareTo < 0){
			//向左查找
			return get(node.left,key);
		}else if(compareTo > 0){
			//向右查找
			return get(node.right,key);
		}else{
			//返回结果
			return node.value;
		}
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值