数据结构:树_左右旋转

树_左右旋转

· 前言:

对于树的旋转其实就是指针的相互指向,那么就要明确一点,一共有多少对指针关系需要我们处理。(上面这个图大家凑活看吧)以右旋为例:我们要操心的是A、B、E这三个节点,这就六个指针了,所以只要把这六个指针的指向弄明白树的旋转就搞定了。

· 流程: 

首先从这里面关联性最少的节点开始处理,E就是首选。(从在起可以根据我说的用铅笔画一下这个流程) 

第一步:认孩子。令A的左指针指向 E ,B的右指针指向A,如果A的父亲(x)存在的话,判断是哪一边,令x指向B

第二步:认爹。判断E是否为空,非空,让E的父指针指向A,B的父指针指向x,A的父指针指向B 至此,旋转完成。

·代码:

#include <stdio.h>
struct BinaryTree
{
	BinaryTree* pFather;
	BinaryTree* pLeft;
	BinaryTree* pRight;
	bool colour ;
	int n_value;
};

void LeftRoate(BinaryTree** pTree);
void RightRoate(BinaryTree** pTree);

void LeftRoate(BinaryTree** pTree)//传入的是当前_调整节点
{
	BinaryTree* pNode = *pTree;
	BinaryTree* pMark = pNode->pRight;

	pNode->pRight = pMark->pLeft;
	pMark->pLeft = pNode;
	if(pNode->pFather != NULL)
	{
		if(pNode->pFather->pLeft == pNode)
			pNode->pFather->pLeft = pMark;
		if(pNode->pFather->pRight == pNode)
			pNode->pFather->pRight = pMark;
	}else
		pRBT = pMark;

	if(pNode->pRight!= NULL)
		pNode->pRight->pFather = pNode;
	pMark->pFather = pNode->pFather;
	pNode->pFather = pMark;


}
void RightRoate(BinaryTree** pTree)
{
	BinaryTree* pNode = *pTree;
	BinaryTree* pMark = pNode->pLeft;
	//处理父类 认孩子
	 pNode->pLeft = pMark->pRight;
	 pMark->pRight = pNode;
	 if(pNode->pFather != NULL)
	 {
		 if(pNode->pFather->pLeft == pNode)
			 pNode->pFather->pLeft = pMark;
		 if(pNode->pFather->pRight == pNode)
			 pNode->pFather->pRight = pMark;
	 }else
		 pRBT = pMark;

	//处理子类  认爹
	 if(pNode->pLeft != nullptr)
		 pNode->pLeft->pFather = pNode;
	 pMark->pFather = pNode->pFather;
	 pNode->pFather = pMark;

}

这里注意一点,树的左右选转使用在RBT(红黑树)等相关调整操纵,它有其适用的场景,所以不用担心树的相关节点为空的情况,这只是一个操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值