91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RBTree(RED,BLACK)Tree

發布時間:2020-07-01 17:18:34 來源:網絡 閱讀:520 作者:小止1995 欄目:編程語言

紅黑樹是一棵二叉搜索樹,它在每個節點上增加了一個存儲位來表示節點的顏色,可以是Red或Black。通過對任何一條從根到葉子簡單路徑上的顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似于平衡。

  • 紅黑樹是滿足下面紅黑性質的二叉搜索樹

  1. 每個節點,不是紅色就是黑色的

  2. 根節點是黑色的

  3. 如果一個節點是紅色的,則它的兩個子節點是黑色的(沒有連續的紅節點)

  4. 對每個節點,從該節點到其所有后代葉節點的簡單路徑上,均包含相同數目的黑色節點。(每條路徑的黑色節點的數量相等

  5. 每個葉子節點都是黑色的(這里的葉子節點是指的NIL節點(空節點))

#include<iostream>
using namespace std;
enum COL
{
	RED,
	BLACK
};
template<class K,class V>
struct RBTreeNode
{
	K _key;
	V _val;
	RBTreeNode<K, V>* _left;
	RBTreeNode<K, V>* _right;
	RBTreeNode<K, V>* _parent;
	COL _col;
	RBTreeNode(K& key, V& val)
		:_key(key)
		, _val(val)
		, _left(NULL)
		, _right(NULL)
		, _parent(NULL)
		, _col(RED)
	{}
};
template<class K,class V>
class RBTree{
	typedef RBTreeNode<K, V> Node;
public:
	RBTree()
		:_root(NULL)
	{}
	bool Insert(K& key, V& val)
	{
		if (_root == NULL)
		{
			_root = new Node(key, val);
		}
		else
		{
			Node* parent = NULL;
			Node* cur = _root;
			while (cur)
			{
				if (cur->_key < key)
				{
					parent = cur;
					cur = cur->_right;
				}
				else if (cur->_key>key)
				{
					parent = cur;
					cur = cur->_left;
				}
				else
				{
					return false;
				}
			}
			cur = new Node(key, val);
			if (parent->_key < key)
				parent->_right = cur;
			else
				parent->_left = cur;
			cur->_parent = parent;
			//符合紅黑樹規范

			while (cur != _root&&parent->_col == RED)
			{
				Node* grandfather = parent->_parent;
				if (grandfather->_left == parent)
				{
					Node* uncle = grandfather->_right;
					if (uncle&&uncle->_col == RED)//1.
					{
						parent->_col = uncle->_col=BLACK;
						grandfather->_col = RED;

						//繼續往上調
						cur = grandfather;
						parent = cur->_parent;
					}
					else
					{
						if (cur == parent->_right)
						{
							RotateL(parent);
							swap(parent, cur);//*左旋后,指針位置yibian
						}
						parent->_col = BLACK;
						grandfather->_col = RED;
						RotateR(grandfather);
						break;
					}
				}
				else//反的情況
				{
					Node* uncle = grandfather->_left;
					if (uncle&&uncle->_col == RED)
					{
						parent->_col = uncle->_col = BLACK;
						grandfather->_col = RED;
						//繼續往上調
						cur = grandfather;
						parent = cur->_parent;
					}
					else
					{
						if (cur == parent->_left)
						{
							RotateR(parent);
							swap(cur, parent);
						}
						parent->_col = BLACK;
						grandfather->_col = RED;
						RotateL(grandfather);
						break;
					}
				}
			}
		}
		_root->_col = BLACK;
		return true;
	}
	Node* Find(const K& key)
	{
		Node* cur = _root;
		while (cur)
		{
			if (cur->_key < key)
				cur = cur->_right;
			else if (cur->_key>key)
				cur = cur->_left;
			else
				return cur;
		}
		return NULL;
	}
	bool Remove(const K& key)
	{

	}
	bool isBalance()
	{
		if (_root == NULL)
			return true;
		if (_root->_col == RED)
			return false;
		int k = 0;
		Node* cur = _root;
		while (cur)
		{
			if (cur->_col==BLACK)
				++k;
			cur = cur->_left;
		}
		int count = 0;
		return _IsBalance(_root, k, count);
	}
	void InOrder()
	{
		_InOrder(_root);
	}
protected:
	void _InOrder(Node* root)
	{
		if (root == NULL)
			return;
		_InOrder(root->_left);
		cout << root->_key << " ";
//		cout << root->_key << "color"<<root->_col << "  ";
		_InOrder(root->_right);
	}
	bool _IsBalance(Node* root, const int k, int count)
	{
		if (root == NULL)
			return true;
		if (root->_col == RED)
		{
			if (root->_parent->_col == RED)
			{
				cout << "顏色不正確" << root->_key << endl;
				return false;
			}
		}
		else
			++count;
		if (root->_left == NULL&&root->_right == NULL)
		{
			if (count == k)
				return true;
			else
			{
				cout << "黑色節點個數不對" << root->_key<<endl;
				return false;
			}
		}
		return _IsBalance(root->_left, k, count) && _IsBalance(root->_right, k, count);
	}
	void RotateL(Node* parent)
	{
		Node* subR = parent->_right;
		Node* subRL = subR->_left;
		parent->_right = subRL;
		if (subRL)
			subRL->_parent = parent;

		Node* ppNode = parent->_parent;
		subR->_left = parent;
		parent->_parent = subR;
		if (ppNode == NULL)
		{
			subR->_parent = NULL;
			_root = subR;
		}
		else
		{
			if (ppNode->_left == parent)
			{
				ppNode->_left = subR;
			}
			else
			{
				ppNode->_right = subR;
			}
			subR->_parent = ppNode;
		}
	}
	void RotateR(Node* parent)
	{
		Node* subL = parent->_left;
		Node* subLR = subL->_right;
		parent->_left = subLR;
		if (subLR)
			subLR->_parent = parent;

		Node* ppNode = parent->_parent;
		subL->_right = parent;
		parent->_parent = subL;
		if (ppNode == NULL)
		{
			subL->_parent = NULL;
			_root = subL;
		}
		else
		{
			if (ppNode->_left == parent)
			{
				ppNode->_left = subL;
			}
			else
			{
				ppNode->_right = subL;
			}
			subL->_parent = ppNode;
		}
	}
private:
	Node* _root;
};
void Test1()
{
	RBTree<int, int> t;
	int a[] = { 4, 2, 6, 1, 3, 5, 15, 7, 16, 14 };
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); ++i)
	{
		t.Insert(a[i], i);
	}
	t.InOrder();
	t.isBalance();
}

#include"RBtree.h"
int main()
{
	Test1();
	system("pause");
	return 0;
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绥化市| 建昌县| 尼玛县| 石城县| 岳普湖县| 濉溪县| 桂阳县| 马关县| 岚皋县| 民丰县| 申扎县| 泽库县| 金塔县| 高邑县| 泸水县| 炎陵县| 临泽县| 冷水江市| 黄浦区| 浮山县| 汉沽区| 永昌县| 茶陵县| 府谷县| 弥渡县| 调兵山市| 澄城县| 包头市| 扶余县| 澄江县| 南宫市| 东阳市| 乳山市| 鄱阳县| 临海市| 土默特左旗| 本溪市| 肃北| 合江县| 饶平县| 佳木斯市|