java红黑树代码实现

时间: 2023-08-31 10:37:39 浏览: 72
### 回答1: 红黑树是一种自平衡二叉查找树,它在保持二叉查找树基本性质的同时,通过对节点进行染色,保持了树的平衡,从而保证了最坏情况下的时间复杂度为 O(log n)。 下面是一个简单的 Java 实现: ```java public class RedBlackTree<K extends Comparable<K>, V> { private static final boolean RED = true; private static final boolean BLACK = false; private class Node { private K key; private V value; private Node left, right; private boolean color; private int size; public Node(K key, V value, boolean color, int size) { this.key = key; this.value = value; this.color = color; this.size = size; } } private Node root; public RedBlackTree() { } private boolean isRed(Node x) { if (x == null) return false; return x.color == RED; } private int size(Node x) { if (x == null) return 0; return x.size; } public int size() { return size(root); } public boolean isEmpty() { return root == null; } public V get(K key) { if (key == null) throw new IllegalArgumentException("argument to get() is null"); return get(root, key); } private V get(Node x, K key) { while (x != null) { int cmp = key.compareTo(x.key); if (cmp < 0) x = x.left; else if (cmp > 0) x = x.right; else return x.value; } return null; } public boolean contains(K key) { return get(key) != null; } public void put(K key, V value) { if (key == null) throw new IllegalArgumentException("first argument to put() is null"); if (value == null) { delete(key); return; } root = put(root, key, value); root.color = BLACK; } private Node put(Node h, K key, V value) { if (h == null) return new Node(key, value, RED, 1); int cmp = key.compareTo(h.key); if (cmp < 0) h.left = put(h.left, key, value); else if (cmp > 0) h.right = put(h.right, key, value); else h.value = value; if (isRed(h.right) && !isRed(h.left)) h = rotateLeft(h); if (isRed(h.left) && isRed(h.left.left)) h = rotateRight(h); if (isRed(h.left) && isRed(h.right)) flipColors(h); h.size = size(h.left) + size(h.right) + 1; return h; } public void deleteMin() { if (isEmpty()) throw new NoSuchElementException("BST underflow"); if (!isRed(root.left) && !isRed(root.right)) root.color = RED; root = deleteMin(root); if (!isEmpty()) root.color = BLACK; } private Node deleteMin(Node h) { if (h.left == null) return null; if (!isRed(h.left) && !isRed(h.left.left)) h = moveRedLeft(h); h.left = deleteMin ### 回答2: 红黑树是一种自平衡的二叉查找树,它在进行插入和删除操作时能够维持良好的平衡性,保证了查找、插入和删除的时间复杂度为O(log n)。 下面是Java语言实现红黑树的代码: ```java class RedBlackTree { private static final boolean RED = true; private static final boolean BLACK = false; private class Node { int key; Node left; Node right; Node parent; boolean color; Node(int key) { this.key = key; this.left = null; this.right = null; this.parent = null; this.color = RED; } } private Node root; public RedBlackTree() { root = null; } private Node findNode(int key) { Node current = root; while (current != null) { if (key < current.key) { current = current.left; } else if (key > current.key) { current = current.right; } else { return current; } } return null; } private void rotateLeft(Node node) { Node rightChild = node.right; node.right = rightChild.left; if (rightChild.left != null) { rightChild.left.parent = node; } rightChild.parent = node.parent; if (node.parent == null) { root = rightChild; } else if (node == node.parent.left) { node.parent.left = rightChild; } else { node.parent.right = rightChild; } rightChild.left = node; node.parent = rightChild; } private void rotateRight(Node node) { Node leftChild = node.left; node.left = leftChild.right; if (leftChild.right != null) { leftChild.right.parent = node; } leftChild.parent = node.parent; if (node.parent == null) { root = leftChild; } else if (node == node.parent.right) { node.parent.right = leftChild; } else { node.parent.left = leftChild; } leftChild.right = node; node.parent = leftChild; } public void insert(int key) { Node newNode = new Node(key); Node current = root; Node parent = null; while (current != null) { parent = current; if (newNode.key < current.key) { current = current.left; } else { current = current.right; } } newNode.parent = parent; if (parent == null) { root = newNode; } else if (newNode.key < parent.key) { parent.left = newNode; } else { parent.right = newNode; } fixInsert(newNode); } private void fixInsert(Node node) { while (node != root && node.parent.color == RED) { if (node.parent == node.parent.parent.left) { Node uncle = node.parent.parent.right; if (uncle != null && uncle.color == RED) { node.parent.color = BLACK; uncle.color = BLACK; node.parent.parent.color = RED; node = node.parent.parent; } else { if (node == node.parent.right){ node = node.parent; rotateLeft(node); } node.parent.color = BLACK; node.parent.parent.color = RED; rotateRight(node.parent.parent); } } else { Node uncle = node.parent.parent.left; if (uncle != null && uncle.color == RED) { node.parent.color = BLACK; uncle.color = BLACK; node.parent.parent.color = RED; node = node.parent.parent; } else { if (node == node.parent.left){ node = node.parent; rotateRight(node); } node.parent.color = BLACK; node.parent.parent.color = RED; rotateLeft(node.parent.parent); } } } root.color = BLACK; } } ``` 这段代码实现了红黑树的插入操作。红黑树的插入操作分为以下几步:首先,按照二叉查找树的规则将新节点插入到适当的位置,并将其颜色设置为红色;接着,通过一系列的旋转和颜色调整来保持红黑树的平衡性。 其中,rotateLeft()和rotateRight()分别实现了左旋和右旋操作,用于保持树的平衡性;findNode()方法用于查找具有指定键值的节点;insert()方法表示向红黑树中插入一个新节点,并在插入后调用fixInsert()方法进行修复操作。 在修复操作中,通过不断旋转和颜色调整来保持树的平衡性,直到满足红黑树的性质。 ### 回答3: 红黑树是一种自平衡的二叉搜索树,其中每个节点都有一个附加的存储位来表示节点的颜色,可以是红色或黑色。红黑树具有以下性质: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色。 3. 所有叶子节点(NIL节点,空节点)都是黑色。 4. 每个红色节点的两个子节点都是黑色。 5. 从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。 以下是实现红黑树的Java代码示例: ```java // 定义红黑树节点类 class RBTreeNode { int key; // 节点键值 int color; // 节点颜色(0表示红色,1表示黑色) RBTreeNode left; // 左子节点 RBTreeNode right; // 右子节点 RBTreeNode parent; // 父节点 public RBTreeNode(int key, int color) { this.key = key; this.color = color; this.left = null; this.right = null; this.parent = null; } } // 红黑树类 class RedBlackTree { private RBTreeNode root; public RedBlackTree() { this.root = null; } // 左旋 private void leftRotate(RBTreeNode x) { RBTreeNode y = x.right; x.right = y.left; if (y.left != null) { y.left.parent = x; } y.parent = x.parent; if (x.parent == null) { this.root = y; } else if (x == x.parent.left) { x.parent.left = y; } else { x.parent.right = y; } y.left = x; x.parent = y; } // 右旋 private void rightRotate(RBTreeNode x) { RBTreeNode y = x.left; x.left = y.right; if (y.right != null) { y.right.parent = x; } y.parent = x.parent; if (x.parent == null) { this.root = y; } else if (x == x.parent.right) { x.parent.right = y; } else { x.parent.left = y; } y.right = x; x.parent = y; } // 插入节点 public void insert(int key) { RBTreeNode node = new RBTreeNode(key, 0); // 新插入的节点默认为红色 RBTreeNode y = null; RBTreeNode x = this.root; while (x != null) { y = x; if (node.key < x.key) { x = x.left; } else { x = x.right; } } node.parent = y; if (y == null) { this.root = node; } else if (node.key < y.key) { y.left = node; } else { y.right = node; } insertFixup(node); } // 插入修复操作 private void insertFixup(RBTreeNode node) { while (node.parent != null && node.parent.color == 0) { // 当父节点为红色时需要修复 if (node.parent == node.parent.parent.left) { // 当父节点是祖父节点的左子节点 RBTreeNode uncle = node.parent.parent.right; // 叔节点 if (uncle != null && uncle.color == 0) { // 叔节点存在且为红色 node.parent.color = 1; uncle.color = 1; node.parent.parent.color = 0; node = node.parent.parent; } else { // 叔节点不存在或为黑色 if (node == node.parent.right) { node = node.parent; leftRotate(node); } node.parent.color = 1; node.parent.parent.color = 0; rightRotate(node.parent.parent); } } else { // 当父节点是祖父节点的右子节点 RBTreeNode uncle = node.parent.parent.left; // 叔节点 if (uncle != null && uncle.color == 0) { // 叔节点存在且为红色 node.parent.color = 1; uncle.color = 1; node.parent.parent.color = 0; node = node.parent.parent; } else { // 叔节点不存在或为黑色 if (node == node.parent.left) { node = node.parent; rightRotate(node); } node.parent.color = 1; node.parent.parent.color = 0; leftRotate(node.parent.parent); } } } this.root.color = 1; // 根节点为黑色 } } ``` 以上是一个简单的Java红黑树的代码实现,实现了插入功能并保持树的红黑性质。

相关推荐

最新推荐

recommend-type

软考-考生常见操作说明-202405101400-纯图版.pdf

软考官网--2024常见操作说明:包括如何绘制网络图、UML图、表格等 模拟作答系统是计算机技术与软件专业技术资格(水平)考试的电子化考试系统界面、作答过程的仿真系统,为各级别、各资格涉及输入和页面显示的部分题型提供体验性练习。
recommend-type

setuptools-34.0.3.zip

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

基于遗传优化GA的三目标优化仿真【包括程序,注释,操作步骤】

1.版本:matlab2022A。 2.包含:程序,中文注释,仿真操作步骤(使用windows media player播放)。 3.领域:遗传优化 4.仿真效果:仿真效果可以参考博客同名文章《基于遗传优化GA的三目标优化仿真》 5.内容:基于遗传优化GA的三目标优化仿真。遗传算法(Genetic Algorithm, GA)是一种模拟自然选择和遗传机制的全局搜索优化方法,广泛应用于解决复杂优化问题,包括具有多个目标的优化问题,即多目标遗传算法(Multi-Objective Genetic Algorithm, MOGA)。在这里,将三个目标函数进行统一的编码,通过单目标遗传优化的方式,同步求解三个目标函数的最优值。 6.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
recommend-type

基于单通道脑电信号的自动睡眠分期研究.zip

本项目使用了Sleep-EDF公开数据集的SC数据进行实验,一共153条整晚的睡眠记录,使用Fpz-Cz通道,采样频率为100Hz 整套代码写的较为简洁,而且有添加相应的注释,因此进行分享,而且不仅仅说是睡眠分期,也可以作为学习如何使用神经网络去进行时序数据分类问题的一个入门项目,包括怎么用GRU、LSTM和Attention这些经典网络结构。 网络结构(具体可查看network.py文件): 网络整体结构类似于TinySleepNet,对RNN部分进行了修改,增加了双向RNN、GRU、Attention等网络结构,可根据参数进行调整选择。 定义了seq_len参数,可以更灵活地调整batch_size与seq_len。 数据集加载(具体可查看dataset.py文件) 直接继承自torch的Dataset,并定义了seq_len和shuffle_seed,方便调整输入,并复现实验。 训练(具体可查看train.py文件):
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依