【剑指offter】【C++】【二叉树】27. 二叉树的镜像
题目:
请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入: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. 二叉树的镜像相关推荐
- 剑指offer面试题27. 二叉树的镜像(递归)
题目描述 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 思路 详见链接 代码 class Solution:def mirrorTree(self, root:TreeNode)->Tr ...
- 《LeetCode力扣练习》剑指 Offer 28. 对称的二叉树 Java
<LeetCode力扣练习>剑指 Offer 28. 对称的二叉树 Java 一.资源 题目: 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的 ...
- LeetCode Algorithm 剑指 Offer 28. 对称的二叉树
剑指 Offer 28. 对称的二叉树 Ideas 一开始想的有问题,看了例子以为对称二叉树的中序遍历序列是回文数组,然后就用这么写了,结果到第192个测试用例[1,2,2,2,null,2]就失败了 ...
- 【LeetCode】剑指 Offer 28. 对称的二叉树
[LeetCode]剑指 Offer 28. 对称的二叉树 文章目录 [LeetCode]剑指 Offer 28. 对称的二叉树 一.递归 一.递归 对称二叉树定义:对于书中任意两个对称结点 L 和 ...
- 剑指offer——复习1:二叉树三种遍历方式的迭代与递归实现
剑指offer--复习1:二叉树三种遍历方式的迭代与递归实现 20180905更新:这个博客中的解法不是很好,看相应的LeetCode题目笔记~~~ 我感觉此博客中的说法更容易让人理解:https:/ ...
- 剑指 Offer 28. 对称的二叉树 -- 递归
0 题目描述 leetcode原题链接:剑指 Offer 28. 对称的二叉树 1 递归解法 对称二叉树定义: 对于树中 任意两个对称节点 LLL 和 R,R,R, 一定有: L.val=R.val: ...
- 剑指offter笔记
剑指offter笔记 数组中重复的数字 二维数组中的查找 替换空格 从尾到头打印链表 递归反转链表解题思路 重建二叉树 用两个栈实现队列 斐波那契数列 青蛙跳台阶问题 旋转数组的最小数字 矩阵中的路径 ...
- 【重点】剑指offer——面试题27:二叉搜索树与双向链表
剑指offer--面试题27:二叉搜索树与双向链表 Solution1: 这是书上的代码,要理解好最近几道题,对指针的操作比较多... class Solution { public:TreeNode ...
- 《剑指offter》
剑指offter 电子书PDF https://github.com/YST521/JZOF.git 最近几天看博客时发现一本叫 剑指offter的书 ,里面主要是一些算法题.这些算法面 ...
- 剑指offer-面试题6.重建二叉树
题目:输入某二叉树的前序遍历和中序遍历结果,请重建出该二叉树.假设 输入的前序遍历和中序遍历的结果都不含重复的数字.例如输入前序遍历 序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...
最新文章
- C++:vector中使用.clear()函数
- loadrunner11下载地址
- CCNA必会知识点:PAP单双向认证
- 剑指offer(21):栈的压入、弹出序列
- 可以叫板Google的一个搜索引擎 —— DuckDuckGo
- lie group and computer vision : 李群、李代数在计算机视觉中的应用
- python通过函数类属性_函数作为类属性的赋值如何成为Python中的一个方法?
- 智能一代云平台(四):15年上半年维护过程中精彩小插曲
- java抛异常 代替返回_Java使用和C++类似的异常处理
- wait, notify, notifyAll
- java函数式 new_Java函数式编程-4.lambda表达式一些高级用法
- SQL Server Compact 3.5 SP1 RTM发布了!
- 大数据平台以及一些核心组件介绍
- 技术图文:如何利用C#寻找免费的IP代理服务器?
- Anaconda常用命令小结
- 网络音视频下载小套路-dy、xmly
- node.js 下载速度慢问题
- 关于魔兽世界插件AddOns
- LeetCode 1 Two Sum
- 打造高效敏捷的研发独立团 (2009年培训心得)