RBTree

红黑树特性:

1、节点颜色非黑即红

2、根节点颜色一定是黑色

3、某一节点到其任意叶节点的路径中黑结点数量相等(保证了这颗树最长路径长度不超过最短路径的2倍)

4、不能有连续的两个红节点

#ifndef __RBTREE__
#define __RBTREE__

#include <iostream>
#include <stack>

//节点颜色,非黑即红
enum colour{
	RED,
	BLACK
};

//节点数据结构
template<class K>
struct RBTreeNode
{
	typedef RBTreeNode<K>* Node_p;
	Node_p _left;
	Node_p _right;
	Node_p _parent;
	K _key;
	colour _colour;
	RBTreeNode(const K& key = K())
		:_left(NULL)
		, _right(NULL)
		, _parent(NULL)
		, _key(key)
		, _colour(RED)
	{}
};

//红黑树结构
template<class K>
class RBTree
{
	typedef RBTreeNode<K> Node;
	typedef Node* Node_p;
public:
	RBTree()
		:_root(NULL)
	{}
	std::pair<Node_p, bool> Find(K key)
	{
		if (_root == NULL){
			return std::pair<Node_p, bool>(NULL, false);
		}
		Node_p cur = _root;
		Node_p parent = NULL;
		while (cur){
			if (cur->_key == key)
				return std::pair<Node_p, bool>(cur, true);
			else if (key < cur->_key){
				parent = cur;
				cur = cur->_left;
			}
			else{
				parent = cur;
				cur = cur->_right;
			}
		}
		return std::pair<Node_p, bool>(parent, false);
	}
	bool Insert(K key)
	{
		if (_root == NULL){//空树
			_root = new Node(key);
			_root->_colour = BLACK;
			return true;
		}
		std::pair<Node_p, bool> ret = Find(key);
		if (ret.second)//找到了键为key的节点,无法插入
			return false;

		Node_p parent = ret.first;
		Node_p Grandparent = parent->_parent;
		Node_p cur;
		Node_p GGrandparent;
		_Insert(parent,key);

		if (parent->_colour == BLACK)
			return true;

		//祖父节点Grandparent一定存在
		if (key < parent->_key){
			cur = parent->_left;
		}
		else{
			cur = parent->_right;
		}
		//***********************以上插入成功
		//***********************以下判断是否需要旋转变色
		Node_p Uncle;

		while (Grandparent){
			if (parent == Grandparent->_left)
				Uncle = Grandparent->_right;
			else
				Uncle = Grandparent->_left;

			GGrandparent = Grandparent->_parent;
			if (Uncle == NULL || Uncle->_colour == BLACK){//Grandparent一定为黑,旋转之后也一定为黑
				if (parent == Grandparent->_left){
					if (parent->_right == cur){//U为黑,cur内插,把cur转换为外插
						_RotateL(parent);
						std::swap(parent,cur);
					}
					_RotateR(Grandparent);
					parent->_colour = BLACK;
					Grandparent->_colour = RED;
				}
				else{
					if (parent->_left == cur){//U为黑,cur内插,把cur转换为外插
						_RotateR(parent);
						std::swap(parent, cur);
					}
					_RotateL(Grandparent);
					parent->_colour = BLACK;
					Grandparent->_colour = RED;
				}
				break;
			}
			else if (Uncle->_colour == RED){//Grandparent一定为黑,旋转之后为红
				if (parent == Grandparent->_left){
					if (parent->_right == cur){//U为红,cur内插,转为外插
						_RotateL(parent);
						std::swap(parent, cur);
					}
					_RotateR(Grandparent);
					cur->_colour = BLACK;
				}
				else{
					if (parent-> _left == cur){//U为红,cur内插
						_RotateR(parent);
						std::swap(parent, cur);
					}
					_RotateL(Grandparent);
					cur->_colour = BLACK;
				}

				if (GGrandparent && GGrandparent->_colour == RED){
					cur = parent ;
					parent = cur->_parent;
					Grandparent = parent->_parent;
				}
				else
					break;
			}
		}
		_root->_colour = BLACK;
		return true;
	}
	void InOrder()
	{
		_InOrder(_root);
		std::cout << std::endl;
	}
	void InOrder_Non_R()
	{
		std::stack<Node_p> s;
		Node_p cur = _root;

		while (cur || !s.empty() ){
			while (cur){
				s.push(cur);
				cur = cur->_left;
			}
			Node_p tmp=s.top();
			s.pop();
			std::cout << tmp->_key<<"	";
			cur = tmp->_right;
		}
		std::cout << std::endl;
	}
	bool Is_Balance()
	{}
private:
	void _Insert(Node_p cur,K& key)
	{
		Node_p tmp = new Node(key);
		if (key < cur->_key){
			cur->_left = tmp;
		}
		else{
			cur->_right = tmp;
		}
		tmp->_parent = cur;
	}
	//左旋
	void _RotateL(Node_p parent)
	{
		Node_p subR = parent->_right;
		Node_p subRL = subR->_left;
		parent->_right = subRL;
		if (subRL)
			subRL->_parent = parent;

		subR->_left = parent;
		Node_p ppNode = parent->_parent;
		parent->_parent = subR;

		if (ppNode){
			if (ppNode->_left == parent)
				ppNode->_left = subR;
			else
				ppNode->_right = subR;
			subR->_parent = ppNode;
		}
		else{
			_root = subR;
			subR->_parent = NULL;
		}
	}
	//右旋
	void _RotateR(Node_p parent)
	{
		Node_p subL = parent->_left;
		Node_p subLR = subL->_right;
		parent->_left = subLR;
		if (subLR)
			subLR->_parent = parent;

		Node_p ppNode = parent->_parent;
		subL->_right = parent;
		parent->_parent = subL;

		if (ppNode){
			if (ppNode->_left == parent)
				ppNode->_left = subL;
			else
				ppNode->_right = subL;
			subL->_parent = ppNode;
		}
		else{
			_root = subL;
			subL->_parent = NULL;
		}
	}
	void _InOrder(Node_p root)
	{
		if (root == NULL)
			return;

		_InOrder(root->_left);
		std::cout << root->_key << "	";
		_InOrder(root->_right);
	}
protected:
	Node_p _root;
	size_t _node_count;//记录结点数量
};
#endif
时间: 2024-12-19 09:16:13

RBTree的相关文章

RBTree(RED,BLACK)Tree

红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black.通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡. 红黑树是满足下面红黑性质的二叉搜索树 每个节点,不是红色就是黑色的 根节点是黑色的 如果一个节点是红色的,则它的两个子节点是黑色的(没有连续的红节点) 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点.(每条路径的黑色节点的数量相等) 每个叶子节点都是黑色的(这里的叶

平衡树之RB-tree

1 #include <memory> 2 3 template<class T> 4 struct rb_node 5 { 6 T key; 7 bool color;//true red | false black 8 std::shared_ptr<rb_node> lchild, rchild, parent; 9 10 rb_node(T key, bool color = true, std::shared_ptr<rb_node> lchild

二叉搜索树—RBTree(红黑树)

  红黑树又称二叉搜索树,它主要是通过红和黑两种颜色(red.black)来标识节点.通过对任何一条从根节点到叶子节点路径上的节点颜色进行约束,红黑树保证最长路径不超过最短路径的两倍,所以说:红黑树是近似于平衡的. ■下面是红黑树的主要特点: (1)红黑树的根节点是黑色的. (2)红黑树中若一个节点是红色的,则它的两个子节点必须是黑色的. (3)红黑树中从该节点到后代叶节点的路径上,黑色节点数目是相同的.        ◆红黑树的应用: C++库.linux内核.java库等        ◆红

红黑树 RBTree

概述:R-B Tree,又称为"红黑树".本文参考了<算法导论>中红黑树相关知识,加之自己的解,然后以图文的形式对红黑树进行说明.本文的主要内容包括:红黑树的特性,红黑树的时间复杂度和它的证明,红黑树的左旋.右旋.插入等操作. 1 R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为"红黑树",它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). 红黑树的特性:(1)每个

stl(GCC4.9.3 in MinGW)中rbtree lower_bound/upper_bound 的实现

STL内部实现的rbtree,实现 lower_bound/upper_bound 过程,是从 begin() 开始向 end() 进行遍历,将元素的 key 与目标 key 进行比较,直至找到的第一个符合要求的 iterator 为止!具体看代码,如下 位于bits/stl_tree.h 1 template<typename _Key, typename _Val, typename _KeyOfValue, 2 typename _Compare, typename _Alloc> 3

红黑树(RBTREE)之上-------构造红黑树

该怎么说呢,现在写代码的速度还是很快的,很高兴,o(^▽^)o. 光棍节到了,早上没忍住,手贱了一般,看到*D的优惠,买了个机械键盘,晚上就到了,敲着还是很舒服的,和老婆炫耀了一把哈哈. 光棍节再去*mall买个,带着上班用. 正题,构造红黑树,就是节点的插入与调整,具体的理论我就不说了,图我也不画了,别人画的很好,我在纸上画的我自己都不想看.   贴几个网址作为参考吧: 参考的文档:1.http://www.cnblogs.com/zhb-php/p/5504481.html (推荐) 2.h

RBTree(红黑树)--C++

红黑树是满足下面性质的二叉搜索树 1. 每个节点,不是红色就是黑色的 2. 根节点是黑色的 3. 如果一个节点是红色的,则它的两个子节点是黑色的 4. 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点. #pragma once enum Color{ RED, BLACK }; template<class K, class V> struct RBtreeNode { RBtreeNode(const K& key, const V& v, Co

RBtree插入跟删除图解代码

一.红黑树的简介 红黑树是一种平衡的二叉查找树,是一种计算机科学中常用的数据结构,最典型的应用是实现数据的关联,例如map等数据结构的实现. 红黑树有以下限制: 1. 节点必须是红色或者是黑色 2. 根节点是黑色的 3. 所有的叶子节点是黑色的. 4. 每个红色节点的两个子节点是黑色的,也就是不能存在父子两个节点全是红色 5. 从任意每个节点到其每个叶子节点的所有简单路径上黑色节点的数量是相同的. 要说明一下限制3.一般在红黑树中,每个节点空指针处还会加空的黑色的孩子(称为岗哨).所以限制3一定

平衡搜索树--红黑树 RBTree

红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black. 通过对任何一条从根到叶子节点简单路径上的颜色来约束树的高度,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡. 红黑树是满足下面红黑性质的二叉搜索树: 1. 每个节点,不是红色就是黑色的 2. 根节点是黑色的 3. 如果一个节点是红色的,则它的两个子节点是黑色的(不存在连续的红色节点) 4. 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点. 思考:为什么满足上面