二叉树的左旋和右旋

#include <iostream>
#define NULLVAL -1

using namespace std;

bool BLACK = true;
bool RED = false;
 
class RBTree {
	public:
		RBTree* left;
		RBTree* right;
		float val;
		bool color;
		RBTree* parent;
		RBTree() {
			left = NULL;
			right = NULL;
			val = NULLVAL;
			color = BLACK;
			parent = NULL;
		}
}; 

//添加子树 
void setChildTree(RBTree* &node, char direct, float value, bool color) {
	if (node == NULL) return;
	RBTree* child = new RBTree(); 
	child->parent = node;
	child->color = color;
	child->val = value;
	if(direct == 'r') node->right = child;
	else node->left = child;
}

//查询一个节点的父节点
RBTree* ParentOf(RBTree* node) {
	return (node == NULL) ? NULL : node->parent; 
}

//查询一个节点的叔叔节点
RBTree* UncleOf(RBTree* node) {
	//先找到该节点的爷爷节点
	//然后判断该节点的父节点是爷爷节点的左子树还是右子树
	RBTree* father = ParentOf(node);
	RBTree* grand = ParentOf(father);
	if (grand == NULL) return NULL;
	if (father == grand->left) {
		return (grand->right == NULL) ? NULL : grand->right; 
	} else if (father == grand->right){
		return (grand->left == NULL) ? NULL : grand->left;
	} else {
		return NULL;
	}
}

//更改节点颜色
void SetColor(RBTree* node, bool color) {
	node->color = color;
}

//查询一个节点的左子节点
RBTree* LeftChildOf(RBTree* node) {
	if(node == NULL) return NULL;
	return node->left;
}

//查询一个节点的右子节点
RBTree* RightChildOf(RBTree* node) {
	if(node == NULL) return NULL;
	return node->right;
}

//节点的左旋
void LeftRotation(RBTree* &root, RBTree* node) {
	if(node == NULL) return;
	if(node->right == NULL) return;
	RBTree* father = node->parent;
	RBTree* nodeRight = node->right;
	//处理nodeRight的左子树
	if (nodeRight->left == NULL) {
		node->right = NULL;
	} else {
		node->right = nodeRight->left;
		nodeRight->left->parent = node;
	}
	//处理node的原来的父节点
	if(father == NULL) {
		nodeRight->parent = NULL;
		root = nodeRight;
	} else {
		nodeRight->parent = father;
		if(father->left == node) {
			father->left = nodeRight;
		} else {
			father->right = nodeRight;
		}
	}
	//处理nodeRight新的左子树
	nodeRight->left = node;
	node->parent = nodeRight;
}

//节点的右旋
void RightRotation(RBTree* &root, RBTree* node) {
	if(node == NULL) return;
	if(node->left == NULL) return;
	
	RBTree* father = node->parent;
	RBTree* nodeLeft = node->left;
	//处理nodeLeft的右子树
	if(nodeLeft->right == NULL) {
		node->left = NULL
	} else {
		node->left = nodeLeft->right;
		nodeLeft->right->parent = node; 
	}
	
	//处理father和nodeLeft的关系
	if(father == NULL) {
		nodeLeft->parent = NULL;
		root = nodeLeft;
	} else {
		nodeLeft->parent = father;
		if(father->left == node) {
			father->left = nodeLeft;
		} else {
			father->right = nodeLeft;
		}
	}
	
	//处理node和nodeLeft的关系
	node->parent = nodeLeft;
	nodeLeft->right = node;
}


void InOrder(RBTree* root) {
	if(root != NULL) {
		InOrder(root->left);
		cout << "输出根节点: " << root->val << endl;
		InOrder(root->right);  
	}
}

int main() {
	RBTree* root = new RBTree();
	root->val = 10; //根节点数据为10 
	setChildTree(root, 'l', 9, BLACK);
	setChildTree(root, 'r', 11, BLACK);
	
	setChildTree(root->left, 'l', 8, BLACK);
	setChildTree(root->left, 'r', 9.5, BLACK);
	
	setChildTree(root->right, 'l', 10.5, BLACK);
	setChildTree(root->right, 'r', 12, BLACK);
	
	setChildTree(root->left->left, 'l', 7.5, BLACK);
	setChildTree(root->left->left, 'r', 8.5, BLACK);
	
	setChildTree(root->left->right, 'l', 9.25, BLACK);
	setChildTree(root->left->right, 'r', 9.75, BLACK);
	
	setChildTree(root->right->right, 'l', 11.5, BLACK);
	setChildTree(root->right->right, 'r', 12.5, BLACK);
	
	return 0; 
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值