剑指Offer - 面试题27:二叉树的镜像

Posted 林夕07

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer - 面试题27:二叉树的镜像相关的知识,希望对你有一定的参考价值。

题目

请完成一个函数,输入一棵二叉树,该函数输出它的镜像。二叉树节点的定义如下:

typedef int TElemType;  /* 树结点的数据类型,目前暂定为整型 */
struct BianryTreeNode
{
	TElemType m_nValue;
	BianryTreeNode* m_pLeft, * m_pRight;//左右孩子节点
};

分析

先画出一对二叉树,并写出三序列遍历结果,一会用于判断新的二叉树是否为原二叉树的镜像。观察下图,发现就是左右对调,本质就是依次交换该节点的左右子节点遇到空为止。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210519150957265.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR

递归法

C++

#include <iostream>
using namespace std;

typedef int TElemType;  /* 树结点的数据类型,目前暂定为整型 */
struct BinaryTreeNode
{
	TElemType m_nValue;
	BinaryTreeNode* m_pLeft, * m_pRight;//左右孩子节点
};

void CreatTree(BinaryTreeNode** T)
{
	TElemType elem;

	
	cin >> elem;
	if (elem != 999)
	{
		*T = new BinaryTreeNode();
		if (NULL == T)
		{
			return;
		}
		(*T)->m_nValue = elem;
		CreatTree(&((*T)->m_pLeft));
		CreatTree(&((*T)->m_pRight));
	}
	else
	{
		*T = nullptr;
	}
}

void Print(TElemType n)
{
	cout << n << " ";
}


void Preorder(BinaryTreeNode* root)//前序遍历
{
	if (NULL == root)
	{
		return;
	}

	Print(root->m_nValue);
	Preorder(root->m_pLeft);
	Preorder(root->m_pRight);
}

void Inorder(BinaryTreeNode* root)//中序输出
{
	if (NULL == root)
	{
		return;
	}

	Inorder(root->m_pLeft);
	Print(root->m_nValue);
	Inorder(root->m_pRight);
}

void Postorder(BinaryTreeNode* root)//后续输出
{
	if (NULL == root)
	{
		return;
	}

	Postorder(root->m_pLeft);
	Postorder(root->m_pRight);
	Print(root->m_nValue);
}

void MirrorRecursively(BinaryTreeNode* pNode)//二叉树的镜像
{
	//当前节点为空,或者没有子树了。
	if ((nullptr == pNode) || (nullptr == pNode->m_pLeft && nullptr == pNode->m_pRight))
	{
		return;
	}

	//交换左右子树
	BinaryTreeNode* tmp = pNode->m_pLeft;
	pNode->m_pLeft = pNode->m_pRight;
	pNode->m_pRight = tmp;

	//调用自己的左子树
	MirrorRecursively(pNode->m_pLeft);
	//调用自己的右子树
	MirrorRecursively(pNode->m_pRight);
}

int main()
{
	BinaryTreeNode* root = nullptr;

	cout << "请按照先序遍历规则输入节点值(输入999表示当前为空):" << endl;
	CreatTree(&root);

	printf("先序输出:");
	Preorder(root);
	printf("\\n中序输出:");
	Inorder(root);
	printf("\\n后序输出:");
	Postorder(root);
	
	MirrorRecursively(root);
	cout << "\\n--------------二叉树的镜像---------" << endl;
	printf("先序输出:");
	Preorder(root);
	printf("\\n中序输出:");
	Inorder(root);
	printf("\\n后序输出:");
	Postorder(root);
}

测试结果如下,与上图对比发现完全一致。
在这里插入图片描述
本章完!

以上是关于剑指Offer - 面试题27:二叉树的镜像的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer面试题27. 二叉树的镜像

剑指offer面试题27. 二叉树的镜像

剑指offer-面试题27-二叉树的镜像-二叉树

剑指Offer - 面试题27:二叉树的镜像

剑指offer:面试题19二叉树的镜像

[剑指offer]面试题19:二叉树的镜像