代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int nValue;
struct node *pLeft;
struct node *pRight;
struct node *pFather;
}BinaryTree;
BinaryTree *CreateBinaryTree()
{
BinaryTree *pRoot = NULL;
//根
pRoot = (BinaryTree*)malloc(sizeof(BinaryTree));
pRoot->nValue = 1;
pRoot->pFather = NULL;
//根的左
pRoot->pLeft = (BinaryTree*)malloc(sizeof(BinaryTree));
pRoot->pLeft->nValue = 2;
pRoot->pLeft->pFather = pRoot;
//左的左
pRoot->pLeft->pLeft = (BinaryTree*)malloc(sizeof(BinaryTree));
pRoot->pLeft->pLeft->nValue = 4;
pRoot->pLeft->pLeft->pFather = pRoot->pLeft;
pRoot->pLeft->pLeft->pLeft = NULL;
pRoot->pLeft->pLeft->pRight = NULL;
//左的右
pRoot->pLeft->pRight = (BinaryTree*)malloc(sizeof(BinaryTree));
pRoot->pLeft->pRight->nValue = 5;
pRoot->pLeft->pRight->pFather = pRoot->pLeft;
pRoot->pLeft->pRight->pLeft = NULL;
pRoot->pLeft->pRight->pRight = NULL;
//根的右
pRoot->pRight = (BinaryTree*)malloc(sizeof(BinaryTree));
pRoot->pRight->nValue = 3;
pRoot->pRight->pFather = pRoot;
//右的左
pRoot->pRight->pLeft = (BinaryTree*)malloc(sizeof(BinaryTree));
pRoot->pRight->pLeft->nValue = 6;
pRoot->pRight->pLeft->pFather = pRoot->pRight;
pRoot->pRight->pLeft->pLeft = NULL;
pRoot->pRight->pLeft->pRight = NULL;
//右的右
pRoot->pRight->pRight = NULL;
return pRoot;
}
void PreOrderTrversal(BinaryTree *pTree)
{
if(pTree == NULL)return;
//根
printf("%d ",pTree->nValue);
//左
PreOrderTrversal(pTree->pLeft);
//右
PreOrderTrversal(pTree->pRight);
}
void RightRotate(BinaryTree **pTree)
{
if(*pTree == NULL)return;
BinaryTree *pNode = NULL;
BinaryTree *pMark = NULL;
pNode = *pTree;
pMark = pNode->pLeft; //右旋 标记支点的左侧
//三个孩子关系
pNode->pLeft = pMark->pRight;
pMark->pRight = pNode;
//支点父亲是否存在 如果存在 找出支点是其父亲的左孩子还是右孩子
if( pNode->pFather != NULL)
{
if(pNode == pNode->pFather->pLeft)
{
pNode->pFather->pLeft = pMark;
//如果是pNode是其父亲的左孩子,则让pMark作为父亲的左孩子 }
else
{
pNode->pFather->pRight = pMark;//如果是品pNode的右孩子,则让pMark作为父亲的右孩子
}
}
else
{
*pTree = pMark;
}
//三个父亲关系
if(pNode->pLeft != NULL)
{
pNode->pLeft->pFather = pNode;
}
pMark->pFather = pNode->pFather;
pNode->pFather = pMark;
}
void LeftRotate(BinaryTree **pTree)
{
if(*pTree == NULL)return;
BinaryTree *pNode = NULL;
BinaryTree *pMark = NULL;
pNode = *pTree;
pMark = pNode->pRight; //左旋 标记支点的右侧
//三个孩子关系
pNode->pRight = pMark->pLeft;
pMark->pLeft = pNode;
//支点父亲是否存在
if( pNode->pFather != NULL)
{
if(pNode == pNode->pFather->pLeft)
{
pNode->pFather->pLeft = pMark;
}
else
{
pNode->pFather->pRight = pMark;
}
}
else
{
*pTree = pMark;
}
//三个父亲关系
if(pNode->pRight != NULL)
{
pNode->pRight->pFather = pNode;
}
pMark->pFather = pNode->pFather;
pNode->pFather = pMark;
}
int main()
{
BinaryTree *pTree = NULL;
pTree = CreateBinaryTree();
PreOrderTrversal(pTree);
printf("\n");
RightRotate(&pTree);
PreOrderTrversal(pTree);
printf("\n");
LeftRotate(&pTree);
PreOrderTrversal(pTree);
return 0;
}