使用红黑树实现Map

devtools/2024/9/23 22:53:36/

一、Color类(节点颜色)

java">/*自定义一个枚举类型 Color,它所声明的变量只有REC和BLACK两种值,其必须使用Color.+值的方式进行赋值*/
public enum Color {RED,BLACK
}

二、Pair类(键值对)

java">/*** key-value 对象* @param <K> 键* @param <V> 值*/
public class Pair<K extends Comparable<K>,V>{public K key;public V value;public Pair() {}public Pair(K key, V value) {this.key = key;this.value = value;}@Overridepublic String toString() {return "Pair{" +"key=" + key +", value=" + value +'}';}
}

三、RBTNode类(红黑树节点)

java">/*** 红黑树节点(实现Map)*/
public class RBTNode <K extends Comparable<K>,V>{Pair<K,V> pair;// 节点值RBTNode<K,V> left;// 左节点RBTNode<K,V> right;// 右节点Color color;// 节点颜色public RBTNode() {}public RBTNode(Pair<K, V> pair) {this.pair = pair;this.color = Color.RED;}@Overridepublic String toString() {return "RBTNode{" +"pair=" + pair +", left=" + left +", right=" + right +", color=" + color +'}';}
}

四、RBT类(红黑树)

java">/*** 红黑树(实现Map)* @param <K> 键* @param <V> 值*/
public class RBT <K extends Comparable<K>,V>{public int size;// 节点数目/*** 获取树中的节点数目* @return*/public int getSize(){return this.size;}/*** 判断当前节点的颜色是否为红色* @param node 当前节点* @return 是否*/private boolean isRead(RBTNode node){if(node == null) return false;return node.color == Color.RED;}/*** 左旋当前节点并将新节点返回* @param node 当前节点* @return 新节点*/private RBTNode leftRotate(RBTNode node){RBTNode X = node.right;RBTNode T2 = X.left;node.right = T2;X.left = node;// 将旧节点颜色赋给新节点X.color = node.color;// 将红色赋给旧节点node.color = Color.RED;return X;}/*** 右旋当前节点并将新节点返回* @param node 当前节点* @return 新节点*/private RBTNode rightRotate(RBTNode node){RBTNode X = node.left;RBTNode T2 = X.right;node.left = T2;X.right = node;// 将旧节点颜色赋给新节点X.color = node.color;// 将旧节点的颜色变为红色node.color = Color.RED;return X;}/*** 赋值当前节点及左右节点的颜色* @param node*/private void reverseColor(RBTNode node){node.color = Color.RED;node.left.color = Color.BLACK;node.right.color = Color.BLACK;}/*** 在当前节点中插入值为pair的节点* @param node 当前节点* @param pair 节点值* @return 新节点*/public RBTNode<K,V> insert(RBTNode<K,V> node,Pair<K,V> pair){if(node ==  null){size++;return new RBTNode<>(pair);}if(pair.key.compareTo(node.pair.key) == 0){node.pair.value = pair.value;}else if(pair.key.compareTo(node.pair.key) < 0){node.left = insert(node.left, pair);}else{node.right = insert(node.right, pair);}// 调整节点位置和节点颜色// 三个顺序操作,即对当前节点都要进行的操作// 左旋操作if(isRead(node.right) && !isRead(node.left)){node = leftRotate(node);}// 右旋操作if(isRead(node.left) && isRead(node.left.left)){node = rightRotate(node);}// 颜色翻转if(isRead(node.left) && isRead(node.right)){reverseColor(node);}return node;}/*** 在当前节点中获取键为key的节点* @param node 当前节点* @param key 键值* @return 键为key的节点*/public RBTNode<K,V> get(RBTNode<K,V> node,K key){if(node == null) return null;if(key.compareTo(node.pair.key) == 0){return node;}else if(key.compareTo(node.pair.key) < 0){return get(node.left, key);}else{return get(node.right, key);}}/*** 中序遍历当前节点* @param node 当前节点*/public void inOrder(RBTNode node){if(node == null) return;inOrder(node.left);System.out.println(node.pair.key+":"+node.pair.value);inOrder(node.right);}
}

五、TestRBT(测试)

java">public class TestRBT {public static void main(String[] args) {RBT<Integer,Integer> tree = new RBT<>();RBTNode<Integer,Integer> root = null;root = tree.insert(root, new Pair<>(24, 244));root = tree.insert(root, new Pair<>(51, 511));root = tree.insert(root, new Pair<>(11, 111));root = tree.insert(root, new Pair<>(23, 233));root = tree.insert(root, new Pair<>(47, 477));root.color = Color.BLACK;tree.inOrder(root);System.out.println(tree.getSize());System.out.println(tree.get(root, 11));}
}


http://www.ppmy.cn/devtools/116214.html

相关文章

Java项目实战II基于Java+Spring Boot+MySQL的房屋租赁管理系统的设计与实现

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市租…

【Kubernetes】常见面试题汇总(十九)

目录 59.简述 Kubernetes 所支持的存储供应模式&#xff1f; 60.简述 Kubernetes CSl 模型&#xff1f; 61.简述 Kubernetes Worker节点加入集群的过程&#xff1f; 59.简述 Kubernetes 所支持的存储供应模式&#xff1f; Kubernetes 支持两种资源的存储供应模式&#xff1a…

Java设计模式全面解析

23大设计模式&#xff08;即软件设计中的24种常用设计模式&#xff09;源自《设计模式&#xff1a;可复用面向对象软件的基础》一书&#xff0c;由四位作者&#xff08;Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides&#xff09;提出&#xff0c;通常也被称为“Go…

[云服务器13] 如何正确选择云服务器?

【非广告&#xff0c;仅提供建议&#xff0c;没有强制消费引导】 这期我们不讲搭建教程了&#xff0c;因为我想到前面12篇的教程&#xff0c;有关套餐配置的教程好像都有点敷衍…… 所以这期我们主要来说一说服务器的配置选择和不同配置的应用场景。 网站: 雨云 打开后&…

【计算机网络篇】计算机网络概述

本文主要介绍计算机网络第一章节的内容&#xff0c;文中的内容是我认为的重点内容&#xff0c;并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 文章目录 &#x1f3af;一.计算机网络的组成 ✨主要内容 1.边缘部…

强化学习Reinforcement Learning|Q-Learning|SARSA|DQN以及改进算法

一、强化学习RL 强化学习是机器学习的一个重要的分支&#xff0c;是一种有效的工具&#xff0c;在文献中被广泛用于解决MDP问题。在一个强化学习过程中&#xff0c;一个智能体只能通过和它所处的环境互动学习最优策略。特别地&#xff0c;智能体首先观察自己当前的状态&#xf…

Matlab自学笔记36:日期时间型的概念、分类和创建方法

1.概念 日期时间型&#xff08;Dates and Time&#xff09;数据具有灵活的显示格式和高达毫微秒的精度&#xff0c;并且可以处理时区、夏令时和平闰年等特殊因素 2.日期时间型数据有以下三种表示方式 &#xff08;1&#xff09;Datetime型&#xff0c;表示日期时间点&#x…

在交互式系统中,非剥夺是不是一个好的策略?为什么?

非剥夺方式:分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生某事件而阻塞时,才把处理机分配给另一个进程。 剥夺方式:当一个进程正在运行时,系统可以基于某种原则,剥夺已分配给它的处理机,将之分配给其它进程。剥夺原则有:优先权原则、短进程、优先…