题目:

请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:4/   \2     7/ \   / \
1   3 6   9
镜像输出:4/   \7     2/ \   / \
9   6 3   1

1 主要思路:

  考的知识是二叉树的遍历。在遍历非叶子节点时,交换左右指针的内容即可。

2 实现代码:


/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:TreeNode* mirrorTree(TreeNode* root) {if(root){if((root->left != NULL) || (root->right !=NULL)){mirrorTree(root->left);//@1//swap(root->left, root->right);mirrorTree(root->right);//@2swap(root->left, root->right);}}return root;}
};

代码评析:

报过错:Line 13: Char 19: runtime error: member access within null pointer of type 'TreeNode'
意思是说,运行过程出现TreeNode类型的空指针?

1)题目只是要求二叉树,但是我画蛇添足的考虑了带顺序的二叉树。因此代码中出现了判断左右子树至少一个不为NULL的条件,也就是此时的节点是双亲。但是当出现只有一个孩子的双亲时,运行完左子树仍然会去运行右子树,因此造成空指针;

2)此时只判断root!=NULL也可以,但是其会多执行在叶子节点处的左右空指针的交换步骤;

3)在判别时,可以采用相反的判断条件:如果…成立,就return。其中判别条件要将常判断或者判别比重大的放在左边,因为有短路规则;

4)可以不使用swap函数来交换。虽然时递归操作,但是当经过@1的层层递归后,root指向的仍然是当前的这个节点,而后再去调用@2,当然root此时也是指向的当前的节点,因此完全可以通过t=a;a=b;b=t;的方式实现交换。

5)这个题与如何遍历二叉树的顺序无关,前序、中序、后序都可,其只是访问节点的先后不同。

3 优秀代码:

class Solution {public:TreeNode* mirrorTree(TreeNode* root) {if(root == NULL || (root->left == NULL && root->right == NULL)) return root;TreeNode* tmp = root->left;root->left = mirrorTree(root->right);root->right = mirrorTree(tmp);return root;}
};

其中root为空意在防止有一个孩子的双亲;
左右孩子都为空意在不执行叶子节点的左右孩子的赋值。

//抄
class Solution{public:TreeNode* mirrorTree(TreeNode* root){if(root==NULL||(root->left==NULL&&root->right==NULL)) return root;TreeNode* tmp = root->left;root->left = mirrorTree(root->right);root->right = mirrorTree(tmp);return root;}
}
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:TreeNode* mirrorTree(TreeNode* root) {if(root==nullptr) return nullptr;auto p=mirrorTree(root->left);auto q=mirrorTree(root->right);root->left=q;root->right=p;return root;}
};

【剑指offter】【C++】【二叉树】27. 二叉树的镜像相关推荐

  1. 剑指offer面试题27. 二叉树的镜像(递归)

    题目描述 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 思路 详见链接 代码 class Solution:def mirrorTree(self, root:TreeNode)->Tr ...

  2. 《LeetCode力扣练习》剑指 Offer 28. 对称的二叉树 Java

    <LeetCode力扣练习>剑指 Offer 28. 对称的二叉树 Java 一.资源 题目: 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的 ...

  3. LeetCode Algorithm 剑指 Offer 28. 对称的二叉树

    剑指 Offer 28. 对称的二叉树 Ideas 一开始想的有问题,看了例子以为对称二叉树的中序遍历序列是回文数组,然后就用这么写了,结果到第192个测试用例[1,2,2,2,null,2]就失败了 ...

  4. 【LeetCode】剑指 Offer 28. 对称的二叉树

    [LeetCode]剑指 Offer 28. 对称的二叉树 文章目录 [LeetCode]剑指 Offer 28. 对称的二叉树 一.递归 一.递归 对称二叉树定义:对于书中任意两个对称结点 L 和 ...

  5. 剑指offer——复习1:二叉树三种遍历方式的迭代与递归实现

    剑指offer--复习1:二叉树三种遍历方式的迭代与递归实现 20180905更新:这个博客中的解法不是很好,看相应的LeetCode题目笔记~~~ 我感觉此博客中的说法更容易让人理解:https:/ ...

  6. 剑指 Offer 28. 对称的二叉树 -- 递归

    0 题目描述 leetcode原题链接:剑指 Offer 28. 对称的二叉树 1 递归解法 对称二叉树定义: 对于树中 任意两个对称节点 LLL 和 R,R,R, 一定有: L.val=R.val: ...

  7. 剑指offter笔记

    剑指offter笔记 数组中重复的数字 二维数组中的查找 替换空格 从尾到头打印链表 递归反转链表解题思路 重建二叉树 用两个栈实现队列 斐波那契数列 青蛙跳台阶问题 旋转数组的最小数字 矩阵中的路径 ...

  8. 【重点】剑指offer——面试题27:二叉搜索树与双向链表

    剑指offer--面试题27:二叉搜索树与双向链表 Solution1: 这是书上的代码,要理解好最近几道题,对指针的操作比较多... class Solution { public:TreeNode ...

  9. 《剑指offter》

    剑指offter 电子书PDF        https://github.com/YST521/JZOF.git 最近几天看博客时发现一本叫 剑指offter的书 ,里面主要是一些算法题.这些算法面 ...

  10. 剑指offer-面试题6.重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历结果,请重建出该二叉树.假设 输入的前序遍历和中序遍历的结果都不含重复的数字.例如输入前序遍历 序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...

最新文章

  1. C++:vector中使用.clear()函数
  2. loadrunner11下载地址
  3. CCNA必会知识点:PAP单双向认证
  4. 剑指offer(21):栈的压入、弹出序列
  5. 可以叫板Google的一个搜索引擎 —— DuckDuckGo
  6. lie group and computer vision : 李群、李代数在计算机视觉中的应用
  7. python通过函数类属性_函数作为类属性的赋值如何成为Python中的一个方法?
  8. 智能一代云平台(四):15年上半年维护过程中精彩小插曲
  9. java抛异常 代替返回_Java使用和C++类似的异常处理
  10. wait, notify, notifyAll
  11. java函数式 new_Java函数式编程-4.lambda表达式一些高级用法
  12. SQL Server Compact 3.5 SP1 RTM发布了!
  13. 大数据平台以及一些核心组件介绍
  14. 技术图文:如何利用C#寻找免费的IP代理服务器?
  15. Anaconda常用命令小结
  16. 网络音视频下载小套路-dy、xmly
  17. node.js 下载速度慢问题
  18. 关于魔兽世界插件AddOns
  19. LeetCode 1 Two Sum
  20. 打造高效敏捷的研发独立团 (2009年培训心得)

热门文章

  1. Mathtype中使用inline导致word行间距不一致的问题解决方案
  2. 原生JS实现韩雪冬轮播图
  3. 布尔教育mysql优化_布尔教育燕十八mysql优化视频课件源码分享
  4. Android 9.0 GMS 桌面布局修改
  5. 二级页面的极简模板(帮助理解二级页面)
  6. html 自动悬浮,HTML 悬浮float介绍
  7. 第37届全国青少年信息学奥林匹克竞赛正在长沙市一中进行,不知道这50名小选手怎么样了?
  8. 大厂面经分享:双非五面入职字节,他都做了哪些准备?
  9. 传智播客php拔高_传智播客2017最新php视频课件推荐
  10. socket通信技术