二叉树的翻转代码

原创 2018年04月15日 22:22:49


代码如下:

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


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aaa_cainiao_66666/article/details/79954140

Python算法实战视频课程--二叉树

二叉树是重要的抽象数据类型,解决很多问题时都需要它。通过本课我们学习这种重要的数据结构,本课注重实践,没有过多枯燥的理论,我们的重点放在编码实现各种算法,这对于熟练使用Python语言也是很有益处的。
  • 2016年05月11日 09:14

[数据结构][Leetcode]翻转二叉树

1.问题描述Invert a binary tree.For example: to Google: 90% of our engineers use the software you wr...
  • u014359097
  • u014359097
  • 2015-12-08 22:16:10
  • 2382

反转二叉树----java实现

实现二叉树的反转 示例: 原二叉树: 4 / \ 2 7 / \ / \ 1 3 6 9 反转后的二叉树: 4 / \ 7 ...
  • Emira_J
  • Emira_J
  • 2016-04-26 14:50:07
  • 2693

lintcode 翻转二叉树

1:问题描述  翻转一棵二叉树 样例 1 1 / \ / \ 2 3 => 3 2 / \ 4 4 2:解题思路...
  • wangyukl
  • wangyukl
  • 2017-04-13 16:59:17
  • 743

翻转二叉树(递归与非递归)

翻转一棵二叉树样例 1 1 / \ / \ 2 3 => 3 2 / \ 4 4 递归版本先翻转左子树,后翻转右子树,然...
  • zwhlxl
  • zwhlxl
  • 2015-08-12 06:47:45
  • 3239

图算法之如何反转一颗二叉树

一个题目难倒一个英雄好汉。这个题目曾让Homebrew的作者失去了一次进入Google工作的机会。在这里,我们不讨论是非,只聊技术!我个人认为,算法和数据结构还是要懂一点的。因为算法和数据结构不仅能解...
  • hexudong08
  • hexudong08
  • 2016-05-13 17:34:48
  • 2170

二叉树的翻转 Python

还记得在4月时候的腾讯笔试时候就有这道题目,当时是要C++实现,然而我没学过C++,正好最近正在研究算法,就用Python写吧,其实很简单,之后还会把其他树结构的代码也贴上来。 class Node...
  • qq_33848737
  • qq_33848737
  • 2017-08-03 15:15:00
  • 476

c++二叉树反转代码

  • 2013年01月19日 15:37
  • 1.02MB
  • 下载

二叉树的反转镜像

二叉树的镜像就是二叉树对称的二叉树,比如 镜像之后 就是交换每一非叶子节点的左子树指针和右子树指针 1:递归,如果节点为空,返回,否则交换左右孩子指针;递归镜像节点的左...
  • doubleintfloat
  • doubleintfloat
  • 2016-10-01 17:27:09
  • 1143

【数据结构】二叉树的翻转递归与非递归实现

二叉树的翻转也是递归的过程,左子树转到右子树,右子树转到左子树。假设有这样的一棵二叉树: 它翻转后应该是这样子的: 代码实现: package 二叉树.翻转; import java.uti...
  • e_one
  • e_one
  • 2016-04-05 14:26:32
  • 6248
收藏助手
不良信息举报
您举报文章:二叉树的翻转代码
举报原因:
原因补充:

(最多只允许输入30个字)