平衡二叉树的变形——红黑树(JAVA)
来源:互联网 发布:正版加密软件多少钱 编辑:程序博客网 时间:2024/05/16 07:05
上一个博客中平衡二叉树(AVL)对平衡度要求还是蛮高的,而红黑树就是相对来说放弃了高标准的平衡退而求其次的大致平衡,所以复杂度与AVL差不多,不过效率更高了一些。
优秀参考博客:
红黑树-JAVA实现
红黑树深入剖析及Java实现
浅谈算法和数据结构: 九 平衡查找树之红黑树
下面是一个相对干练的一种实现,实现put 和 search操作
public class RedBlackTreePractice { /** * 红黑数节点 * @param <T> */ private static class Node<T> { public static final boolean RED_NODE = true; public static final boolean BLACK_NODE = false; public boolean nodeColor; // 节点颜色 public Comparable key; // 当前节点搜索key public T value; // 当前节点存储值 public int nodeNumber = 0; // 以当前节点为根节点的子树的节点个数 public Node leftNode,rightNode; // 当前节点的左右子节点 public Node(Comparable key, T value,int number, boolean color){ this.key = key; this.value = value; this.nodeNumber = number; this.nodeColor = color; } /** * 判断当前节点类型 * @return boolean */ public boolean isRed(){ return this.nodeColor == RED_NODE; } /** * 获取当前节点及其子节点个数 * @return int */ public int getSize(){ return nodeNumber; } /** * 计算当前节点及其子节点个数 * @return int */ protected int size(){ int nodeNumber = 1; if (leftNode != null){ nodeNumber += leftNode.getSize(); } if (rightNode != null){ nodeNumber += rightNode.getSize(); } return nodeNumber; } } /** * 红黑数 * @param <T> */ public static class RedBlackTree<T> { private Node<T> root; // 根节点 /** * 红黑树基本操作-左旋转 * @param Node<T> node * @return Node<T> */ protected Node rotateLeft(Node node){ Node tmp = node.rightNode; node.rightNode = tmp.leftNode; tmp.leftNode = node; tmp.nodeColor = node.nodeColor; node.nodeColor = Node.RED_NODE; tmp.nodeNumber = node.nodeNumber; node.nodeNumber = node.size(); return tmp; } /** * 红黑树基本操作-右旋转 * @param Node<T> node * @return Node<T> */ protected Node rotateRight(Node node){ Node tmp = node.leftNode; node.leftNode = tmp.rightNode; tmp.rightNode = node; tmp.nodeColor = node.nodeColor; node.nodeColor = Node.RED_NODE; tmp.nodeNumber = node.nodeNumber; node.nodeNumber = node.size(); return tmp; } /** * 红黑树基本操作-颜色旋转 * @param Node<T> node * @return Node<T> */ protected Node rotateColor(Node node){ node.nodeColor = Node.RED_NODE; node.leftNode.nodeColor = Node.BLACK_NODE; node.rightNode.nodeColor = Node.BLACK_NODE; return node; } /** * 判断节点是否为红节点 * @param node * @return */ protected boolean isRed(Node node){ if (node == null){ return false; } return node.isRed(); } public Node<T> search(Comparable key){ return search(key,this.root); } /** * 查询 * @param key 查询关键字 * @param node 开始查询的根节点 * @return Node 查找到的节点 */ public Node<T> search(Comparable key, Node node){ if (node == null){ return null; } int cmp = key.compareTo(node.key); if (cmp < 0){ return search(key,node.leftNode); }else if (cmp > 0){ return search(key,node.rightNode); }else{ return node; } } /** * 从根节点插入 * @param key * @param value */ public void insert(Comparable key, T value){ Node<T> node = insertSubTree(this.root, key, value); node.nodeColor = Node.BLACK_NODE; this.root = node; } /** * 从某个节点插入 * @param key 插入key * @param value 插入值 */ protected Node insertSubTree(Node node, Comparable key, T value){ if (node == null){ return new Node<T>(key, value, 1, Node.RED_NODE); } // 比较各个节点 int cmp = key.compareTo(node.key); if (cmp < 0){ node.leftNode = insertSubTree(node.leftNode, key, value); }else if (cmp > 0){ node.rightNode = insertSubTree(node.rightNode, key, value); }else{ node.value = value; } if (!isRed(node.leftNode) && isRed(node.rightNode)){ node = rotateLeft(node); } if (isRed(node.leftNode) && isRed(node.leftNode.leftNode)){ node = rotateRight(node); } if (isRed(node.leftNode) && isRed(node.rightNode)){ node = rotateColor(node); } node.nodeNumber = node.size(); return node; } } public static void main(String[] args){ RedBlackTree<String> tree = new RedBlackTree<String>(); int[] insertValue = new int[]{12,1,9,10,77,2,38,8,4}; for (int value : insertValue){ tree.insert(value,"value_" + value); } Node node = tree.search(77); System.out.println(node.value); System.out.println("end"); }}
运行结果截图:
0 0
- 平衡二叉树的变形——红黑树(JAVA)
- AVL(平衡二叉树), 和它变形来的红黑树
- java数据结构——AvlTree(平衡二叉查找树)
- 二叉平衡树(Java)
- 平衡二叉树——红黑树
- 平衡二叉搜索树——红黑树
- 平衡二叉树 java
- 平衡二叉树-Java
- 平衡二叉树 java
- 二叉平衡树avlTree和红黑树rbTree的java实现
- 数据结构—平衡二叉树
- 数据结构—平衡二叉树
- 数据结构—平衡二叉树
- 数据结构—平衡二叉树
- Java实现平衡二叉树(AVLTree)的构建
- 平衡二叉树的java实现
- java实现平衡二叉树的建立
- 平衡二叉树的java实现
- TP框架基础介绍-----(二)
- 阿里面试回来,想和java程序员聊聊
- bzoj1024 [SCOI2009]生日快乐
- TreeSet
- SSH做项目时经验总结
- 平衡二叉树的变形——红黑树(JAVA)
- EF6的多线程与分库架构设计实现
- 指令接收
- Kafka基本概念及环境搭建
- 常用PHP函数系列四:PHP验证身份证号码格式是否正确(基础班)
- hust 长度单位
- Thread(target)之run()方法
- 【Eclipse中使用Git之一】把远程仓库的项目,clone到eclipse里面
- 多媒体之播放音乐