剑指Offer - 面试题27:二叉树的镜像
Posted 林夕07
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer - 面试题27:二叉树的镜像相关的知识,希望对你有一定的参考价值。
题目
请完成一个函数,输入一棵二叉树,该函数输出它的镜像。二叉树节点的定义如下:
typedef int TElemType; /* 树结点的数据类型,目前暂定为整型 */
struct BianryTreeNode
{
TElemType m_nValue;
BianryTreeNode* m_pLeft, * m_pRight;//左右孩子节点
};
分析
先画出一对二叉树,并写出三序列遍历结果,一会用于判断新的二叉树是否为原二叉树的镜像。观察下图,发现就是左右对调,本质就是依次交换该节点的左右子节点遇到空为止。
递归法
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:二叉树的镜像的主要内容,如果未能解决你的问题,请参考以下文章