C++红黑树(一)--------红黑树的创建和插入Node

前言:

    本篇开始,写一个红黑树的小系列,红黑树的结构非常复杂,所以需要好几篇才能写完。本篇主要介绍红黑树的前期理论储备和创建以及插入节点。

一、红黑树的规则:

   1、每一个节点不是红色的就是黑色的。

   2、红黑树的根总是黑色的。

   3、如果节点是红色的,则它的子节点必须是黑色的

   4、从根到叶节点的每条路径,必须包含相同数目的黑色节点。

二、今天要创建的红黑树是这样的:

扫描二维码关注公众号,回复: 12530576 查看本文章

代码如下:


#include <iostream>

using namespace std;

template < class T>
class RedBlackTree;  //红黑树

template <class T>
class RedBlackTreeNode; //红黑树节点


template <class T>
class RedBlackTree
{
	typedef RedBlackTreeNode<T> Node;

public:
	enum { BLACK, RED };

	RedBlackTree(const T &negInfo);  //构造函数主要初始化私有成员 header 和 nullNode
	~RedBlackTree();

	void insert(const T & x); //红黑树插入元素


//private:
	Node *header; //header 的左子节点和右子节点初始化指向nullNode,将来右子节点会指向根节点,
				  //header节点的元素是个无效值
	Node *nullNode; //空节点

	Node *current; //当前节点
	Node *parent; //当前节点的父节点
	Node *grand; //当前节点的祖父节点
	Node *great; //当前节点的曾祖父节点

};


template <class T>
RedBlackTree<T>::RedBlackTree(const T &negInfo)
{
	nullNode = new Node();
	nullNode->left = nullNode->right = NULL;

	header = new Node(negInfo);
	header->left = header->right = nullNode; //header的左右节点初始化为nullNode
}

template <class T >
RedBlackTree<T>::~RedBlackTree()
{
	delete header;
	delete nullNode;
}

template <class T>
void RedBlackTree<T>::insert(const T &x)
{
	current = parent = grand = great = header; // 刚开始都指向头结点
	nullNode->element = x;  //空节点的元素等于新元素

	while (current->element != x)  //红黑树不允许有重复的节点
	{
		great = grand;        //一辈一辈往下循环
		grand = parent;
		parent = current;

		current = x > current->element ? current->right : current->left; //左大、右小
	}

	if (current != nullNode)
	{
		cout << "有重复元素了" << endl;

		return;
	}

	current = new Node(x, nullNode, nullNode);

	if (x < parent->element)
		parent->left = current;
	else
		parent->right = current;

	return;
}

template <class T>
class RedBlackTreeNode
{
	friend  RedBlackTree<T>;

public:
	RedBlackTreeNode(const T & ele = T(),
		RedBlackTreeNode* lf = NULL,
		RedBlackTreeNode *rg = NULL,
		int c = RedBlackTree<T>::BLACK) :element(ele), left(lf), right(rg), color(c)
	{};//红黑树节点构造函数
//private:
	RedBlackTreeNode *left;  //左子节点
	RedBlackTreeNode *right; //右子节点
	T element;				 //元素
	int color;				//节点颜色

};



void insert_test(void)
{
	cout << "insert_test" << endl;
	const int NEG_INFO = -9999;

	RedBlackTree<int> redBlackTree(NEG_INFO);

	redBlackTree.insert(30);
	redBlackTree.insert(15);
	redBlackTree.insert(70);
	redBlackTree.insert(20);

	cout << "原始数据:" << endl;
	cout << redBlackTree.header->right->element << endl;
	cout << redBlackTree.header->right->left->element << endl;
	cout << redBlackTree.header->right->right->element << endl;
	cout << redBlackTree.header->right->left->right->element << endl;
}

int main()
{
	insert_test();

	return 0;
}


 运行结果:

 

猜你喜欢

转载自blog.csdn.net/weixin_40204595/article/details/108057316