# 二叉树的翻转代码

#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;
}


• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120