《剑指offer》第二十七题(二叉树的镜像)
- // 面试题27:二叉树的镜像
- // 题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。
- #include <iostream>
- #include "BinaryTree.h"
- #include <stack>
- void MirrorRecursively(BinaryTreeNode *pNode)//递归算法(自下而上)
- {
- if ((pNode == nullptr) || (pNode->m_pLeft == nullptr && pNode->m_pRight == nullptr))//鲁棒性
- return;
- BinaryTreeNode *pTemp = pNode->m_pLeft;//交换
- pNode->m_pLeft = pNode->m_pRight;
- pNode->m_pRight = pTemp;
- if (pNode->m_pLeft)//遍历
- MirrorRecursively(pNode->m_pLeft);
- if (pNode->m_pRight)
- MirrorRecursively(pNode->m_pRight);
- }
- void MirrorIteratively(BinaryTreeNode* pRoot)//迭代算法(自上而下)
- {
- if (pRoot == nullptr)
- return;
- std::stack<BinaryTreeNode*> stackTreeNode;//建立一个栈
- stackTreeNode.push(pRoot);//压入根节点
- while (stackTreeNode.size() > )//当栈内有元素时
- {
- BinaryTreeNode *pNode = stackTreeNode.top();//取出栈顶元素
- stackTreeNode.pop();
- BinaryTreeNode *pTemp = pNode->m_pLeft;//交换该元素(即节点)的孩子
- pNode->m_pLeft = pNode->m_pRight;
- pNode->m_pRight = pTemp;
- if (pNode->m_pLeft)//如果节点孩子存在,把孩子压入堆栈
- stackTreeNode.push(pNode->m_pLeft);
- if (pNode->m_pRight)
- stackTreeNode.push(pNode->m_pRight);
- }
- }
- // ====================测试代码====================
- // 测试完全二叉树:除了叶子节点,其他节点都有两个子节点
- // 8
- // 6 10
- // 5 7 9 11
- void Test1()
- {
- printf("=====Test1 starts:=====\n");
- BinaryTreeNode* pNode8 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode6 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode10 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode5 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode7 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode9 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode11 = CreateBinaryTreeNode();
- ConnectTreeNodes(pNode8, pNode6, pNode10);
- ConnectTreeNodes(pNode6, pNode5, pNode7);
- ConnectTreeNodes(pNode10, pNode9, pNode11);
- PrintTree(pNode8);
- printf("=====Test1: MirrorRecursively=====\n");
- MirrorRecursively(pNode8);
- PrintTree(pNode8);
- printf("=====Test1: MirrorIteratively=====\n");
- MirrorIteratively(pNode8);
- PrintTree(pNode8);
- DestroyTree(pNode8);
- }
- // 测试二叉树:出叶子结点之外,左右的结点都有且只有一个左子结点
- // 8
- // 7
- // 6
- // 5
- //
- void Test2()
- {
- printf("=====Test2 starts:=====\n");
- BinaryTreeNode* pNode8 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode7 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode6 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode5 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode4 = CreateBinaryTreeNode();
- ConnectTreeNodes(pNode8, pNode7, nullptr);
- ConnectTreeNodes(pNode7, pNode6, nullptr);
- ConnectTreeNodes(pNode6, pNode5, nullptr);
- ConnectTreeNodes(pNode5, pNode4, nullptr);
- PrintTree(pNode8);
- printf("=====Test2: MirrorRecursively=====\n");
- MirrorRecursively(pNode8);
- PrintTree(pNode8);
- printf("=====Test2: MirrorIteratively=====\n");
- MirrorIteratively(pNode8);
- PrintTree(pNode8);
- DestroyTree(pNode8);
- }
- // 测试二叉树:出叶子结点之外,左右的结点都有且只有一个右子结点
- // 8
- // 7
- // 6
- // 5
- // 4
- void Test3()
- {
- printf("=====Test3 starts:=====\n");
- BinaryTreeNode* pNode8 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode7 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode6 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode5 = CreateBinaryTreeNode();
- BinaryTreeNode* pNode4 = CreateBinaryTreeNode();
- ConnectTreeNodes(pNode8, nullptr, pNode7);
- ConnectTreeNodes(pNode7, nullptr, pNode6);
- ConnectTreeNodes(pNode6, nullptr, pNode5);
- ConnectTreeNodes(pNode5, nullptr, pNode4);
- PrintTree(pNode8);
- printf("=====Test3: MirrorRecursively=====\n");
- MirrorRecursively(pNode8);
- PrintTree(pNode8);
- printf("=====Test3: MirrorIteratively=====\n");
- MirrorIteratively(pNode8);
- PrintTree(pNode8);
- DestroyTree(pNode8);
- }
- // 测试空二叉树:根结点为空指针
- void Test4()
- {
- printf("=====Test4 starts:=====\n");
- BinaryTreeNode* pNode = nullptr;
- PrintTree(pNode);
- printf("=====Test4: MirrorRecursively=====\n");
- MirrorRecursively(pNode);
- PrintTree(pNode);
- printf("=====Test4: MirrorIteratively=====\n");
- MirrorIteratively(pNode);
- PrintTree(pNode);
- }
- // 测试只有一个结点的二叉树
- void Test5()
- {
- printf("=====Test5 starts:=====\n");
- BinaryTreeNode* pNode8 = CreateBinaryTreeNode();
- PrintTree(pNode8);
- printf("=====Test4: MirrorRecursively=====\n");
- MirrorRecursively(pNode8);
- PrintTree(pNode8);
- printf("=====Test4: MirrorIteratively=====\n");
- MirrorIteratively(pNode8);
- PrintTree(pNode8);
- }
- int main(int argc, char* argv[])
- {
- Test1();
- Test2();
- Test3();
- Test4();
- Test5();
- system("pause");
- return ;
- }
《剑指offer》第二十七题(二叉树的镜像)的更多相关文章
- 剑指Offer - 九度1521 - 二叉树的镜像
剑指Offer - 九度1521 - 二叉树的镜像2013-11-30 23:32 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入 ...
- 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)
1. 题目描述 /** 请实现一个函数,用来判断一颗二叉树是不是对称的. 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /** 1.只要pRoot.left和 ...
- 剑指Offer:面试题19——二叉树的镜像(java实现)
问题描述: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树结点定义为: public class TreeNode { int val = 0; TreeNode left = null; Tr ...
- 剑指offer(18)二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...
- 剑指offer十八之二叉树的镜像
一.题目 操作给定的二叉树,将其变换为源二叉树的镜像.二叉树的镜像定义: 源二叉树 : 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树: 8 / \ 10 6 / \ ...
- 剑指offer面试题19 二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...
- 【剑指Offer】18、二叉树的镜像
题目描述: 操作给定的二叉树,将其变换为原二叉树的镜像. 解题思路: 求一棵树的镜像的过程:先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子结点.当交换完所有的非 ...
- 剑指offer第二版-8.二叉树的下一个节点
描述:给定一棵二叉树和其中的一个节点,找出中序遍历序列的下一个节点.树中应定义指向左节点.右节点.父节点的三个变量. 思路: 1.如果输入的当前节点有右孩子,则它的下一个节点即为该右孩子为根节点的子树 ...
- 剑指offer五十七之二叉树的下一个结点
一.题目 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 二.思路 结合图,我们可发现分成两大类: 1.有右子树 ...
- 剑指Offer(十七):树的子结构
剑指Offer(十七):树的子结构 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu_ ...
随机推荐
- canvas实现验证码功能
我们在做一些后台系统登录功能的时候,一般都会用到验证码,最多的就是后台生成的验证码图片返回给前端的.也可以不调用后端接口,前端使用canvas直接生成验证码. 由于功能过于简单,不需要多少代码和文字说 ...
- 音响理论基础入门:Gain(增益)
谈到放大器就必须先了解增益:一个小的信号Level(电平)经过放大电路成为大的信号Level ,也就是说由小变大之间的差异就叫增益,也叫放大率,反过来的叫衰减率.在音响系统内,一般以信号源的输入电平决 ...
- Linux中Postfix邮件WebMail配置(七)
Extmail Extmail 是一个以perl语言编写,面向大容量/ISP级应用,免费的高性能Webmail软件,主要包括ExtMail.Extman两个部分的程序套件.ExtMail套件用于提供从 ...
- STM32f103C8T6 Bootloader设计(转)
源:STM32f103C8T6 Bootloader设计 STM32F103c8t6通过串口实现IAP在线升级固件
- 洛谷月赛 Hello World(升级版) - 动态规划
题目背景 T1答案要mod1000000007(10^9+7),请重新提交,非常抱歉! 一天,智障的pipapi正在看某辣鸡讲义学程序设计. 题目描述 在讲义的某一面,他看见了一篇文章.这篇文章由英文 ...
- C++for的几种方式
#include <algorithm> #include <vector> ////////////////////////////////////////////// , ...
- Hadoop新增和删除节点
#新增节点 1.安装lunix,和以前一样的版本 2.初始化系统环境 2.1.设置静态ip vi /etc/sysconfig/network-scripts/ifcfg-eth0 //增加 #Adv ...
- Django框架(五) Django之模板语法
什么是模板 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板 模板语法分类 模板语法之变量:语法为 {{ 变量名 }}: 在 Django 模板中遍历复杂数据结构的关键是句点字 ...
- 【打分策略】Elasticsearch打分策略详解与explain手把手计算
一.目的 一个搜索引擎使用的时候必定需要排序这个模块,一般情况下在不选择按照某一字段排序的情况下,都是按照打分的高低进行一个默认排序的,所以如果正式使用的话,必须对默认排序的打分策略有一个详细的了解才 ...
- Linux下指定pip install和make install安装路径
在Linux下直接用pip install packageName,有些文件会被放到根目录下,如果没有sudo权限的话,是会安装失败的.这个以后我们就需要指定安装的目录了. pip install - ...