树_左右旋转
· 前言:
对于树的旋转其实就是指针的相互指向,那么就要明确一点,一共有多少对指针关系需要我们处理。(上面这个图大家凑活看吧)以右旋为例:我们要操心的是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(红黑树)等相关调整操纵,它有其适用的场景,所以不用担心树的相关节点为空的情况,这只是一个操作。