红黑树的自底向上插入

//.h声明
class RedBlackTree {
public:
	enum ColorType {red,black};
	struct RedBlackNode {
		elemenType val;
		RedBlackNode*left;
		RedBlackNode*right;
		ColorType color;
	};
	typedef RedBlackNode* pNode;
	

	RedBlackTree();
	~RedBlackTree();

	void Insert(elemenType);
	pNode Insert(elemenType,pNode);
	void ShowTree();
	pNode get_root();

private:
	pNode root;
	static pNode NullNode;

	void Init();
	pNode CreateNode(elemenType);
	void MakeEmpty();
	void MakeEmpty(pNode);
	short StateMachine(pNode,pNode,pNode);
	pNode L_L_Rotate(pNode);
	pNode L_R_Rotate(pNode);
	pNode R_R_Rotate(pNode);
	pNode R_L_Rotate(pNode);
	void DrawBlack(pNode);
	void DrawRed(pNode);

};
//定义.cpp 
RedBlackTree::pNode RedBlackTree::NullNode = nullptr;  //全体对象共享

 //private:
void RedBlackTree::Init(){
	if (NullNode == nullptr) {
		NullNode = new RedBlackTree::RedBlackNode;
		NullNode->color = black;
		NullNode->left = NullNode->right = NullNode;
	}
 }

RedBlackTree::pNode RedBlackTree::CreateNode(elemenType n) {
	pNode temp = new RedBlackNode;
	temp->left = temp->right = NullNode;
	temp->val = n;
	temp->color = red;
	return temp;
}

void RedBlackTree::MakeEmpty() {
	MakeEmpty(root);
	root = NullNode;
}

void RedBlackTree::MakeEmpty(pNode root) {
	if (root == NullNode)
		return;
	MakeEmpty(root->left);
	MakeEmpty(root->right);
	delete root;
}

short RedBlackTree::StateMachine(pNode son, pNode parent, pNode grandpa) {
	if (grandpa->val > parent->val &&parent->val > son->val)
		if (grandpa->right->color == black)
			return 1;
		else return 2;
	else if (grandpa->val < parent->val&&parent->val < son->val)
		if (grandpa->left->color == black)
			return 3;
		else return 4;
	else if (grandpa->val > parent->val &&parent->val < son->val)
		if (grandpa->right->color == black)
			return 5;
		else return 6;
	else {
		if (grandpa->left->color == black)
			return 7;
		else return 8;
	}
	return 0;
}

RedBlackTree::pNode RedBlackTree::L_L_Rotate(pNode T)	
{
	pNode temp = T->left;
	T->left = temp->right;
	temp->right = T;
	return temp;

}

RedBlackTree::pNode RedBlackTree::R_R_Rotate(pNode T) {
	pNode temp = T->right;
	T->right = temp->left;
	temp->left = T;
	return temp;
}

RedBlackTree::pNode RedBlackTree::L_R_Rotate(pNode T) {
	T->left = R_R_Rotate(T->left);
	T = L_L_Rotate(T);
	return T;
}

RedBlackTree::pNode RedBlackTree::R_L_Rotate(pNode T) {
	T->right = L_L_Rotate(T->right);
	T = R_R_Rotate(T);
	return T;
}

//public:
RedBlackTree::RedBlackTree() {
	if (NullNode == nullptr) {
		NullNode = new RedBlackNode;
		NullNode->color = black;
		NullNode->left = NullNode->right = NullNode;
	}
	root = NullNode;
}

RedBlackTree::~RedBlackTree() {
	MakeEmpty();
}

void RedBlackTree::Insert(elemenType n) {
	if (root == NullNode) {
		root = new RedBlackNode;
		root->left = root->right = NullNode;
		root->color = black;
		root->val = n; return;
	}
	root = Insert(n, root);
}

void RedBlackTree::DrawBlack(pNode root) {
	root->color = black;
	root->left->color = root->right->color = red;
}

void RedBlackTree::DrawRed(pNode root) {
	root->color = red;
	root->left->color = root->right->color = black;
}

RedBlackTree::pNode RedBlackTree::Insert(elemenType n,pNode root) {
	using std::vector;
	vector<pNode>stack;
	while (root != NullNode) {
		stack.push_back(root);
		if (root->val == n) {
			std::cout << "already exist\n";
			return RedBlackTree::root;
		}
		if (root->val > n) {
			root = root->left;
		}
		else root = root->right;
	}

	root = stack.back();
	if (root->val > n) {
		root->left = CreateNode(n);
		stack.push_back(root->left);
	}
	else {
		root->right = CreateNode(n);
		stack.push_back(root->right);
	}
	if (stack.size() <= 2) 
		return stack.at(0);

	pNode temp=NullNode;
	short son, parent, grandpa;
	short solve;
	while (stack.size() > 2) {
		son = stack.size() - 1;
		parent = son - 1;
		grandpa = parent - 1;
		if (stack.at(son)->color||stack.at(parent)->color) 
			return stack.at(0);
		solve = StateMachine(stack.at(son), stack.at(parent), stack.at(grandpa));
		switch (solve) {
		case 1:temp = L_L_Rotate(stack.at(grandpa)); DrawBlack(temp); break;
		case 2:temp = L_L_Rotate(stack.at(grandpa)); DrawRed(temp); break;
		case 3:temp = R_R_Rotate(stack.at(grandpa)); DrawBlack(temp); break;
		case 4:temp = R_R_Rotate(stack.at(grandpa)); DrawRed(temp); break;
		case 5:temp = L_R_Rotate(stack.at(grandpa)); DrawBlack(temp); break;
		case 6:temp = L_R_Rotate(stack.at(grandpa)); DrawRed(temp); break;
		case 7:temp = R_L_Rotate(stack.at(grandpa)); DrawBlack(temp); break;
		case 8:temp = R_L_Rotate(stack.at(grandpa)); DrawRed(temp); break;
		default:std::cout << "error !!!\n"; break;
		}

		if (grandpa) {
			int index = grandpa - 1;
			stack[index]->left == stack[grandpa] ? stack[index]->left = temp : stack[index]->right = temp;
		}
		for (int i = 3; i > 0; i--)
			stack.pop_back();
		stack.push_back(temp);

	}
	stack.at(0)->color = black;
	return stack.at(0);
}

void RedBlackTree::ShowTree() {
	using std::vector;
	if (root == NullNode)
		return;
	pNode temp;
	vector<pNode> stack;
	short index = 1, front = 0;
	stack.push_back(root);
	while (stack.size() > front) {
		while (index) {
			temp = stack.at(front++);
			if (temp != NullNode) {
				stack.push_back(temp->left);
				stack.push_back(temp->right);

				std::cout << temp->val;
				if (temp->color == black)
					std::cout << 'B';
				else std::cout << 'R';
				std::cout << ' ';
			}
			else {
				std::cout << 'N' << " ";
			}
			index--;
		}
		index = stack.size() - front;
		std::cout << std::endl;
	}
}

通常的红黑树的插入时自顶向下,为了实践实现了一下自底向上的方法,使用了NullNode以简化讨论,使用伪状态机(懒得改了)来实现简洁化代码。已经检验过,可以直接使用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值