剑指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);
}

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林夕07

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值