1. // 面试题27:二叉树的镜像
  2. // 题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。
  3.  
  4. #include <iostream>
  5. #include "BinaryTree.h"
  6. #include <stack>
  7.  
  8. void MirrorRecursively(BinaryTreeNode *pNode)//递归算法(自下而上)
  9. {
  10. if ((pNode == nullptr) || (pNode->m_pLeft == nullptr && pNode->m_pRight == nullptr))//鲁棒性
  11. return;
  12.  
  13. BinaryTreeNode *pTemp = pNode->m_pLeft;//交换
  14. pNode->m_pLeft = pNode->m_pRight;
  15. pNode->m_pRight = pTemp;
  16.  
  17. if (pNode->m_pLeft)//遍历
  18. MirrorRecursively(pNode->m_pLeft);
  19.  
  20. if (pNode->m_pRight)
  21. MirrorRecursively(pNode->m_pRight);
  22. }
  23.  
  24. void MirrorIteratively(BinaryTreeNode* pRoot)//迭代算法(自上而下)
  25. {
  26. if (pRoot == nullptr)
  27. return;
  28.  
  29. std::stack<BinaryTreeNode*> stackTreeNode;//建立一个栈
  30. stackTreeNode.push(pRoot);//压入根节点
  31.  
  32. while (stackTreeNode.size() > )//当栈内有元素时
  33. {
  34. BinaryTreeNode *pNode = stackTreeNode.top();//取出栈顶元素
  35. stackTreeNode.pop();
  36.  
  37. BinaryTreeNode *pTemp = pNode->m_pLeft;//交换该元素(即节点)的孩子
  38. pNode->m_pLeft = pNode->m_pRight;
  39. pNode->m_pRight = pTemp;
  40.  
  41. if (pNode->m_pLeft)//如果节点孩子存在,把孩子压入堆栈
  42. stackTreeNode.push(pNode->m_pLeft);
  43.  
  44. if (pNode->m_pRight)
  45. stackTreeNode.push(pNode->m_pRight);
  46. }
  47. }
  48.  
  49. // ====================测试代码====================
  50. // 测试完全二叉树:除了叶子节点,其他节点都有两个子节点
  51. // 8
  52. // 6 10
  53. // 5 7 9 11
  54. void Test1()
  55. {
  56. printf("=====Test1 starts:=====\n");
  57. BinaryTreeNode* pNode8 = CreateBinaryTreeNode();
  58. BinaryTreeNode* pNode6 = CreateBinaryTreeNode();
  59. BinaryTreeNode* pNode10 = CreateBinaryTreeNode();
  60. BinaryTreeNode* pNode5 = CreateBinaryTreeNode();
  61. BinaryTreeNode* pNode7 = CreateBinaryTreeNode();
  62. BinaryTreeNode* pNode9 = CreateBinaryTreeNode();
  63. BinaryTreeNode* pNode11 = CreateBinaryTreeNode();
  64.  
  65. ConnectTreeNodes(pNode8, pNode6, pNode10);
  66. ConnectTreeNodes(pNode6, pNode5, pNode7);
  67. ConnectTreeNodes(pNode10, pNode9, pNode11);
  68.  
  69. PrintTree(pNode8);
  70.  
  71. printf("=====Test1: MirrorRecursively=====\n");
  72. MirrorRecursively(pNode8);
  73. PrintTree(pNode8);
  74.  
  75. printf("=====Test1: MirrorIteratively=====\n");
  76. MirrorIteratively(pNode8);
  77. PrintTree(pNode8);
  78.  
  79. DestroyTree(pNode8);
  80. }
  81.  
  82. // 测试二叉树:出叶子结点之外,左右的结点都有且只有一个左子结点
  83. // 8
  84. // 7
  85. // 6
  86. // 5
  87. //
  88. void Test2()
  89. {
  90. printf("=====Test2 starts:=====\n");
  91. BinaryTreeNode* pNode8 = CreateBinaryTreeNode();
  92. BinaryTreeNode* pNode7 = CreateBinaryTreeNode();
  93. BinaryTreeNode* pNode6 = CreateBinaryTreeNode();
  94. BinaryTreeNode* pNode5 = CreateBinaryTreeNode();
  95. BinaryTreeNode* pNode4 = CreateBinaryTreeNode();
  96.  
  97. ConnectTreeNodes(pNode8, pNode7, nullptr);
  98. ConnectTreeNodes(pNode7, pNode6, nullptr);
  99. ConnectTreeNodes(pNode6, pNode5, nullptr);
  100. ConnectTreeNodes(pNode5, pNode4, nullptr);
  101.  
  102. PrintTree(pNode8);
  103.  
  104. printf("=====Test2: MirrorRecursively=====\n");
  105. MirrorRecursively(pNode8);
  106. PrintTree(pNode8);
  107.  
  108. printf("=====Test2: MirrorIteratively=====\n");
  109. MirrorIteratively(pNode8);
  110. PrintTree(pNode8);
  111.  
  112. DestroyTree(pNode8);
  113. }
  114.  
  115. // 测试二叉树:出叶子结点之外,左右的结点都有且只有一个右子结点
  116. // 8
  117. // 7
  118. // 6
  119. // 5
  120. // 4
  121. void Test3()
  122. {
  123. printf("=====Test3 starts:=====\n");
  124. BinaryTreeNode* pNode8 = CreateBinaryTreeNode();
  125. BinaryTreeNode* pNode7 = CreateBinaryTreeNode();
  126. BinaryTreeNode* pNode6 = CreateBinaryTreeNode();
  127. BinaryTreeNode* pNode5 = CreateBinaryTreeNode();
  128. BinaryTreeNode* pNode4 = CreateBinaryTreeNode();
  129.  
  130. ConnectTreeNodes(pNode8, nullptr, pNode7);
  131. ConnectTreeNodes(pNode7, nullptr, pNode6);
  132. ConnectTreeNodes(pNode6, nullptr, pNode5);
  133. ConnectTreeNodes(pNode5, nullptr, pNode4);
  134.  
  135. PrintTree(pNode8);
  136.  
  137. printf("=====Test3: MirrorRecursively=====\n");
  138. MirrorRecursively(pNode8);
  139. PrintTree(pNode8);
  140.  
  141. printf("=====Test3: MirrorIteratively=====\n");
  142. MirrorIteratively(pNode8);
  143. PrintTree(pNode8);
  144.  
  145. DestroyTree(pNode8);
  146. }
  147.  
  148. // 测试空二叉树:根结点为空指针
  149. void Test4()
  150. {
  151. printf("=====Test4 starts:=====\n");
  152. BinaryTreeNode* pNode = nullptr;
  153.  
  154. PrintTree(pNode);
  155.  
  156. printf("=====Test4: MirrorRecursively=====\n");
  157. MirrorRecursively(pNode);
  158. PrintTree(pNode);
  159.  
  160. printf("=====Test4: MirrorIteratively=====\n");
  161. MirrorIteratively(pNode);
  162. PrintTree(pNode);
  163. }
  164.  
  165. // 测试只有一个结点的二叉树
  166. void Test5()
  167. {
  168. printf("=====Test5 starts:=====\n");
  169. BinaryTreeNode* pNode8 = CreateBinaryTreeNode();
  170.  
  171. PrintTree(pNode8);
  172.  
  173. printf("=====Test4: MirrorRecursively=====\n");
  174. MirrorRecursively(pNode8);
  175. PrintTree(pNode8);
  176.  
  177. printf("=====Test4: MirrorIteratively=====\n");
  178. MirrorIteratively(pNode8);
  179. PrintTree(pNode8);
  180. }
  181.  
  182. int main(int argc, char* argv[])
  183. {
  184. Test1();
  185. Test2();
  186. Test3();
  187. Test4();
  188. Test5();
  189. system("pause");
  190. return ;
  191. }

《剑指offer》第二十七题(二叉树的镜像)的更多相关文章

  1. 剑指Offer - 九度1521 - 二叉树的镜像

    剑指Offer - 九度1521 - 二叉树的镜像2013-11-30 23:32 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入 ...

  2. 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)

    1. 题目描述 /** 请实现一个函数,用来判断一颗二叉树是不是对称的. 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /** 1.只要pRoot.left和 ...

  3. 剑指Offer:面试题19——二叉树的镜像(java实现)

    问题描述: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树结点定义为: public class TreeNode { int val = 0; TreeNode left = null; Tr ...

  4. 剑指offer(18)二叉树的镜像

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  5. 剑指offer十八之二叉树的镜像

    一.题目 操作给定的二叉树,将其变换为源二叉树的镜像.二叉树的镜像定义:        源二叉树 : 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树: 8 / \ 10 6 / \ ...

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

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像.  输入描述 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  7. 【剑指Offer】18、二叉树的镜像

      题目描述:   操作给定的二叉树,将其变换为原二叉树的镜像.   解题思路:   求一棵树的镜像的过程:先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子结点.当交换完所有的非 ...

  8. 剑指offer第二版-8.二叉树的下一个节点

    描述:给定一棵二叉树和其中的一个节点,找出中序遍历序列的下一个节点.树中应定义指向左节点.右节点.父节点的三个变量. 思路: 1.如果输入的当前节点有右孩子,则它的下一个节点即为该右孩子为根节点的子树 ...

  9. 剑指offer五十七之二叉树的下一个结点

    一.题目 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 二.思路 结合图,我们可发现分成两大类: 1.有右子树 ...

  10. 剑指Offer(十七):树的子结构

    剑指Offer(十七):树的子结构 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu_ ...

随机推荐

  1. canvas实现验证码功能

    我们在做一些后台系统登录功能的时候,一般都会用到验证码,最多的就是后台生成的验证码图片返回给前端的.也可以不调用后端接口,前端使用canvas直接生成验证码. 由于功能过于简单,不需要多少代码和文字说 ...

  2. 音响理论基础入门:Gain(增益)

    谈到放大器就必须先了解增益:一个小的信号Level(电平)经过放大电路成为大的信号Level ,也就是说由小变大之间的差异就叫增益,也叫放大率,反过来的叫衰减率.在音响系统内,一般以信号源的输入电平决 ...

  3. Linux中Postfix邮件WebMail配置(七)

    Extmail Extmail 是一个以perl语言编写,面向大容量/ISP级应用,免费的高性能Webmail软件,主要包括ExtMail.Extman两个部分的程序套件.ExtMail套件用于提供从 ...

  4. STM32f103C8T6 Bootloader设计(转)

    源:STM32f103C8T6 Bootloader设计 STM32F103c8t6通过串口实现IAP在线升级固件

  5. 洛谷月赛 Hello World(升级版) - 动态规划

    题目背景 T1答案要mod1000000007(10^9+7),请重新提交,非常抱歉! 一天,智障的pipapi正在看某辣鸡讲义学程序设计. 题目描述 在讲义的某一面,他看见了一篇文章.这篇文章由英文 ...

  6. C++for的几种方式

    #include <algorithm> #include <vector> ////////////////////////////////////////////// , ...

  7. Hadoop新增和删除节点

    #新增节点 1.安装lunix,和以前一样的版本 2.初始化系统环境 2.1.设置静态ip vi /etc/sysconfig/network-scripts/ifcfg-eth0 //增加 #Adv ...

  8. Django框架(五) Django之模板语法

    什么是模板 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板 模板语法分类 模板语法之变量:语法为 {{ 变量名 }}: 在 Django 模板中遍历复杂数据结构的关键是句点字 ...

  9. 【打分策略】Elasticsearch打分策略详解与explain手把手计算

    一.目的 一个搜索引擎使用的时候必定需要排序这个模块,一般情况下在不选择按照某一字段排序的情况下,都是按照打分的高低进行一个默认排序的,所以如果正式使用的话,必须对默认排序的打分策略有一个详细的了解才 ...

  10. Linux下指定pip install和make install安装路径

    在Linux下直接用pip install packageName,有些文件会被放到根目录下,如果没有sudo权限的话,是会安装失败的.这个以后我们就需要指定安装的目录了. pip install - ...