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

2023-10-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);
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剑指Offer - 面试题27:二叉树的镜像 的相关文章

随机推荐

  • Unity开发基础——基本数据类型学习笔记

    Unity开发基础基本数据类型学习笔记 sbyte byte short ushort int uint long ulong8个是整数 他们之间的区别就是表示氛围不一样 而对于范围不一样的根本原因是类型在内存中的存储不同 C 常用基本数据
  • portlet窗口的状态解析

  • 使用ChatGPT处理Excel表格-终极指南

    ChatGPT是由OpenAI开发的人工智能聊天机器人 可用于各种Excel任务 以提高您的办公效率 无论您是会计师 金融分析师 经理 管理员还是其他企业专业人士 我们将讨论ChatGPT在Excel中可以帮助您的顶级方法 您会惊叹于使用C
  • Obsidian学习从0到1 —— 基本介绍

    文章目录 1 创建一个新库 2 开启实时预览 及所见即所得 3 创建的每一个内容都基于一个资料库 不能从一个资料库链接到另一个资料库 4 一个资料库的所以设置都在这里 obsidian 5 一般插件 快捷键 主题的设置属于一个资料库 但切换
  • 剑指offer——矩形覆盖问题

    题目描述 我们可以用2 1的小矩形横着或者竖着去覆盖更大的矩形 请问用n个2 1的小矩形无重叠地覆盖一个2 n的大矩形 总共有多少种方法 思路一 深度优先搜索 从 0 0 开始遍历 判断此格子情况 判断能否竖着放 横着放 把所有情况试探一遍
  • 使用@Configuration和@Bean给spring容器中注入组件

    Confguration gt 告诉spring这是一个配置类 以前我们是使用配置文件来注册bean的 现如今可以用 Configuration来代替配置文件 配置配 配置文件 Configuration 告诉Spring这是一个配置类 等
  • (附源码)springboot新生报到管理系统 毕业设计15695

    Springboot新生报到管理系统的设计与实现 摘 要 随着科学技术的飞速发展 社会的方方面面 各行各业都在努力与现代的先进技术接轨 通过科技手段来提高自身的优势 新生报到管理系统当然也不能排除在外 新生报到管理系统是以实际运用为开发背景
  • AT32的使用总结

    1 at32板子的烧录测试 at32可以使用他们的at link或者j link烧录代码 不管是at link还是j link 都需要装相应的驱动才能使用 我使用的是at link 可以去at32的官方下载驱动 下载位置如下图所示 keil
  • maven 插件之maven-source-plugin

    在很多情况下 需要对于Maven工程的源代码进行源文件的打包 可以利用source插件来完成 利用Maven的Source插件 对Maven工程的源码进行打jar包 Plugin http maven apache org plugins
  • C语言中的函数(超详细)

    C语言中的函数 超详细 一 函数概述 二 C语言中函数的分类 1 库函数 2 自定义函数 三 函数的参数 1 实际参数 实参 2 形式参数 形参 四 函数的调用 1 传值调用 2 传址调用 五 函数的嵌套调用和链式访问 1 嵌套调用 2 链
  • idea新建springboot项目pom文件报错

    前言 之前也有过类似的情况 只不过都是把spring boot starter parent版本号改成本地仓库已经有的 然后继续开发 今天想写个demo 就新建了一个 然后版本号不一致 就一直报错 所以找了一天问题 才解决 太可怕了 新建s
  • 计算机存储盘教程,手把手的硬盘分区教程

    现在有些小伙伴们对于给电脑硬盘分区想必比较头疼 给电脑硬盘分区分为两种情况 一种是在安装系统之前给系统硬盘分区 另一种是在安装系统之后给硬盘分区 我们现在购买的品牌机和笔记本的用户比较多 而且笔记本和品牌机在买回来后只要简单的释放下系统就好
  • Unity--上传、下载文件并保存到本地

    目录 1 上传文件到服务 2 传参下载到本地 3 直接下载 4 存本地 1 上传文件到服务 public void UpFileToServer StartCoroutine UpLoadFiles StartCoroutine UpLoa
  • jemalloc Linux 安装与使用方法

    jemalloc 在Github上开源了 你可以选择下载release 版本 或者直接clone 源码编译 我选择的是源码编译 clone 项目 git clone https github com jemalloc jemalloc gi
  • visual stdio报错集锦

    error C2220 警告被视为错误 没有生成 object 文件 C 报错 The build tools for v141 Platform Toolset v141 cannot be found vs错误 使用 简体中文GB231
  • 机器学习算法优缺点及适用场景总结

    文章目录 机器学习算法优缺点及适用场景总结 1 线性回归 1 LinearRegression 2 Ridge 3 Lasso 2 LR 逻辑回归 3 KNN 最近邻算法 4 朴素贝叶斯 5 SVM 支持向量机 6 决策树 7 RF 随机森
  • python转换函数使用_Python不使用int()函数把字符串转换为数字实例讲解

    Python不使用int 函数把字符串转换为数字 不使用int 函数的情况下把字符串转换为数字 如把字符串 12345 转换为数字12345 方法一 利用str函数 既然不能用int函数 那我们就反其道而行 用str函数找出每一位字符表示的
  • hikari配置断开重连_Spring boot 数据库连接断线重连问题

    问题描述 我正在做的这个项目 数据库是跨区并且不由自己管理的 防火墙会每隔一段时间就自动断开数据库连接 于是需要对application properties的datasource进行配置 Ps 我使用是mybatis连接数据库 配置及具体
  • MOSFET、IGBT的结构与工作原理详解

    来自百度百科 先学习一下MOSFET 图1是典型平面N沟道增强型NMOSFET的剖面图 它用一块P型硅半导体材料作衬底 在其面上扩散了两个N型区 再在上面覆盖一层二氧化硅 SiO2 绝缘层 最后在N区上方用腐蚀的方法做成两个孔 用金属化的方
  • 剑指Offer - 面试题27:二叉树的镜像

    题目 请完成一个函数 输入一棵二叉树 该函数输出它的镜像 二叉树节点的定义如下 typedef int TElemType 树结点的数据类型 目前暂定为整型 struct BianryTreeNode TElemType m nValue