`
jimmee
  • 浏览: 535937 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

最简单的平衡树(红-黑树)的实现

阅读更多

在二叉搜索树(BST)的基础上,要实现一颗平衡树,可以使用2-3树的方式,2-3树的直接实现,相对比较复杂

,因此算法的研究者们提出了红-黑树的实现方式。

 

package com.test;

public class RedBlackTree<Key extends Comparable<Key>, Value> {
	private static final boolean RED = true;
	private static final boolean BLACK = false;
	
	private Node root;

	private class Node {
		private Key key;
		private Value value;
		private boolean color;
		
		private Node left, right;

		public Node(Key key, Value value, boolean color) {
			super();
			this.key = key;
			this.value = value;
			this.color = color;
		}
	}
	
	private boolean isRed(Node x) {
		if (x == null) return false;
		
		return x.color == RED;
	}
	
	private Node rotateLeft(Node h) {
		Node x = h.right;
		h.right = x.left;
		x.left = h;
		x.color = h.color;
		h.color = RED;
		
		return x;
	}
	
	private Node rotateRight(Node h) {
		Node x = h.left;
		h.left = x.right;
		x.right = h;
		x.color = h.color;
		h.color = RED;
		
		return x;
	}
	
	private void flipColors(Node h) {
		h.color = RED;
		h.left.color = BLACK;
		h.right.color = BLACK;
	} 
	
	public void put(Key key, Value val) {
		root = put(root, key, val);
	}
	
	private Node put(Node h, Key key, Value val) {
		if (h == null) {
			return new Node(key, val, RED);
		}
		
		int cmp = key.compareTo(h.key);
		if (cmp < 0) {
			h.left = put(h.left, key, val);
		} else if (cmp > 0) {
			h.right = put(h.right, key, val);
		} else {
			h.value = val;
		}
		
		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);
		
		return h;
	}
	
	public Value get(Key key) {
		Node x = root;
		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;
	}
}

 

 

分享到:
评论

相关推荐

    若干平衡树的C语言实现_C语言_平衡树_

    它不是严格的平衡树,而是允许节点不平衡,但通过红黑颜色规则保证了最坏情况下的性能。红黑树的每个节点都有颜色属性,可以是红色或黑色,且满足以下性质: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色。...

    红黑树及AVL树常见平衡树实现

    删除操作则更为复杂,可能需要找到替换节点,重新平衡树,并处理节点颜色变化。 在实际应用中,选择红黑树还是AVL树主要取决于对查找速度和插入删除效率的需求。如果查找操作更为频繁,而插入删除操作相对较少,AVL...

    平衡二叉排序树的算法实现

    平衡二叉排序树(Balanced Binary ...在“算法8.10平衡二叉排序树”这个压缩包文件中,可能包含了有关平衡二叉排序树实现的详细代码和示例,你可以通过阅读和理解这些代码来深入学习和掌握平衡二叉排序树的算法实现。

    红黑树、二叉平衡树、二叉排序树的java实现

    本项目涵盖了三种重要的树形数据结构的Java实现:红黑树(RBTree)、二叉平衡树(AVLTree)以及二叉排序树(BSTree)。这些数据结构在处理大量数据时,能够提供高效的插入、删除和查找操作,广泛应用于数据库索引、...

    红黑树实现源码

    - 性能:虽然比AVL树(另一种自平衡树)略逊一筹,但插入和删除操作的复杂度更低,代码实现相对简单。 - 灵活性:红黑树允许红色节点的存在,增加了树的灵活性,降低了旋转的频率。 6. 红黑树的实现细节: 实现...

    红黑树-基于Java实现的红黑树数据结构.zip

    - Java标准库中的`java.util.TreeMap`和`java.util.TreeSet`类底层就是用红黑树实现的。 - 实现红黑树需要定义节点类,包含节点值、颜色、左子节点、右子节点以及父节点等属性,并实现插入、删除、旋转等方法。 6...

    哈工大数据结构与算法实验四平衡树

    数据结构与算法是计算机科学的基础,特别是在处理...在这个实验中,宗畅同学的报告文档很可能会详尽地记录了他实现平衡树的过程,包括可能遇到的问题、解决方案以及性能测试结果,这些都能为其他学习者提供宝贵的参考。

    红黑树-附C代码

    这种数据结构的独特之处在于它通过颜色属性(红色或黑色)来维护树的平衡,确保在最坏情况下的搜索、插入和删除操作的时间复杂度都能保持在O(log n)级别,其中n为树中的节点数量。 红黑树的主要特性有以下五条: 1....

    红黑树Java实现

    这种平衡性保证了红黑树在插入、删除和查找操作上的高效性能,其最坏情况下的时间复杂度为O(log n)。 在Java中,红黑树被广泛应用于集合框架中,如`java.util.TreeMap`和`java.util.TreeSet`。它们都是基于红黑树的...

    数据结构-b类-红黑二叉树-毕业论文.doc

    它的设计目标是在保持二叉查找树特性的同时,通过引入颜色属性(红色或黑色)来确保树的平衡,从而在插入和删除操作后能够快速恢复平衡状态,减少最坏情况下的查找时间。 在红黑树中,每个节点都包含以下信息: 1. ...

    红黑树C++实现

    5. 转换操作:在某些情况下,可能需要将红黑树转换为AVL树或其他自平衡树,以适应不同的性能需求。 在实际的C++实现中,我们通常会定义一个红黑树类,封装节点的创建、插入、删除、查找等方法,并提供友好的接口供...

    AVL树与红黑树实现(可视化界面)

    在插入或删除节点后,可能会破坏平衡,这时需要通过旋转操作(单旋、双旋)来重新平衡树。 - **AVL树的旋转操作**: - 左旋:当一个节点的右子节点的右子节点的高度大于左子节点的高度,且当前节点的平衡因子大于1...

    红黑树-基于C语言实现的红黑树数据结构.zip

    在实际应用中,红黑树广泛用于各种场景,如C++标准库中的STL map和set,它们底层就是基于红黑树实现的。红黑树的高效性和自平衡特性使得它在内存管理、数据库索引、文件系统等领域都有重要应用。理解并熟练掌握红黑...

    AVL-红黑树-前缀树

    这些规则使得红黑树在最坏情况下也能保证O(logn)的时间复杂度。 - 红黑树的实现思路:包括旋转、颜色翻转等操作,如插入节点后可能需要通过调整保持红黑性质。 - 红黑树的平衡证明:基于红黑树的性质,可以证明在...

    关于红黑树(Red-Black Tree)英文论文

    其平衡策略使得它在处理大量数据时,性能优于简单的二叉查找树,但比其他自平衡树(如AVL树)的实现略复杂。然而,由于其对树的平衡要求相对宽松,红黑树在插入和删除操作频繁的场景下通常更受欢迎。 总之,红黑树...

    从2-3树理解红黑树

    尽管这些操作看似复杂,但它们确保了红黑树在最坏情况下的性能仍然接近于2-3树,即保持O(log n)的时间复杂度。 通过2-3树理解红黑树,我们可以看到红黑树实际上是对2-3树的一种简化表示。2-3树中的3节点被拆分成两...

    C++简单实现红黑树的插入

    红黑树是一种自平衡二叉查找树,它在数据结构中扮演着重要的角色,尤其在高效算法实现中。它的设计目标是确保查找、插入和删除等操作的时间复杂度都接近于O(log n)。在C++中实现红黑树,我们需要理解其特性并将其...

    RED-BLACK-tree-and-2-3-4tree.rar_234树到红黑树_红黑树

    例如,插入新节点可能导致连续的两个红色节点,或者导致根节点变为红色,这时就需要通过颜色调整和旋转来重新平衡树。常见的旋转操作包括左旋和右旋,以及可能需要的双旋转。这些旋转操作确保了树的平衡,同时也保持...

    红黑树 - Robert Sedgewick 2008

    这些属性确保了红黑树的平衡,使得最坏情况下的查找、插入和删除操作的时间复杂度都能保持在O(log n)。插入操作通常会破坏红黑树的平衡,但通过旋转(左旋和右旋)和重新着色等操作,可以恢复树的平衡。删除操作更加...

    红黑树编程实现

    这些性质保证了红黑树在最坏情况下的平衡性,使其保持接近完美的平衡状态,确保查找、插入和删除操作的时间复杂度为O(log n)。 在编程实现红黑树时,我们通常会定义一个结构体或类来表示节点,包含键值、颜色、左子...

Global site tag (gtag.js) - Google Analytics