<LeetCode OJ> 226. Invert Binary Tree
226. Invert Binary Tree
Submissions: 136144 Difficulty: Easy
Invert a binary tree.
4
/ \
2 7
/ \ / \
1 3 6 9
to
4
/ \
7 2
/ \ / \
9 6 3 1
Trivia:
This problem was inspired by this original tweet by Max
Howell:
Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.
分析:
下面是别人家的算法:
自己当时实在没想清楚依据给定的代码形式怎样写出反转程序。这里是对其的自我分析。
1,朴素的递归思想:
1)。函数返回值怎样构成原问题的解
明白函数意义,
将根节点root的左右子树镜像反转,并获取翻转后该根节点的指针
TreeNode* invertTree(TreeNode* root) {
函数体.....
}
解的构成,
原问题的解总是由已经解决的左子问题和已经解决的右子问题调换一下就可以。
2)。递归的截止条件
截止条件就是能够得出结论的条件。
假设root不存在。即NULL,显然此时不用再反转,返回NULL就可以
3)总是反复的递归过程
当2)中全部的条件都“躲过了”,即root存在(当然左右子可能不存在)
我们就总是
先获取将root的左子树镜像翻转后的根节点,
再获取将root的右子树镜像翻转后的根节点,
交换两者,并返回root就可以。
TreeNode* newleft = invertTree(root->right);//先获取翻转后的左右子树的根节点
TreeNode* newright = invertTree(root->left);
root->left = newleft;//实现翻转
root->right = newright;
return root;//返回结果
4)控制反复的逻辑
以上已完毕
/**
* 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* invertTree(TreeNode* root) {
if(root == NULL){
return NULL;
}else{
//这样做将:树的底层先被真正交换,然后其上一层才做反转
TreeNode* newleft = invertTree(root->right);
TreeNode* newright = invertTree(root->left);
root->left = newleft;
root->right = newright;
return root;
}
}
};
事实上这个给定形式应该能猜測出,终于我们将二叉树反转后返回的肯定是根节点的指针,那么考虑用递归的话。每一次反转后返回的就是已经被反转后的子树的根节点,即先反转再返回那么直译就是后序式递归方法了,待我好好总结下这些该死的二叉树递归问题。
/************************************************多天后的华丽切割线********************************************************/
多天之后再来吊打此问题,用迭代法来做:
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:
void swapNode(TreeNode* root)
{
TreeNode* newleft=root->right;
TreeNode* newright=root->left;
root->left=newleft;
root->right=newright;
}
TreeNode* invertTree(TreeNode* root) {
if(root==NULL)
return NULL;
//广度优先遍历交换两个子树
queue<TreeNode*> que;
TreeNode* curNode=root;
que.push(curNode);
while (!que.empty())
{
curNode=que.front();//出队首元素
que.pop();//删除队首元素
swapNode(curNode);
if(curNode->left!=NULL)
que.push(curNode->left);
if(curNode->right!=NULL)
que.push(curNode->right);
}
return root;
}
};
3,前序式深度优先搜索。
交换当前根节点的左右子树:
/**
* 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:
void swapNode(TreeNode* root)
{
TreeNode* newleft=root->right;
TreeNode* newright=root->left;
root->left=newleft;
root->right=newright;
}
TreeNode* invertTree(TreeNode* root) {
if(root==NULL)
return NULL;
//前序式深度优先搜索遍历交换两个子树
stack<TreeNode*> stk;
TreeNode* curNode=root;
stk.push(curNode);
while (!stk.empty())
{
curNode=stk.top();//出队首元素
stk.pop();//删除队首元素
swapNode(curNode);
if(curNode->left!=NULL)
stk.push(curNode->left);
if(curNode->right!=NULL)
stk.push(curNode->right);
}
return root;
}
};
參考资源:
【1】递归法參考博文。地址为,http://www.cnblogs.com/ganganloveu/p/4640933.html
【2】迭代法參考自己的还有一篇博文:http://blog.csdn.net/ebowtang/article/details/50448037
注:本博文为EbowTang原创,兴许可能继续更新本文。假设转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/50421096
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895
<LeetCode OJ> 226. Invert Binary Tree的更多相关文章
- LeetCode OJ 226. Invert Binary Tree
Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 Trivia:This problem was ...
- Python解Leetcode: 226. Invert Binary Tree
leetcode 226. Invert Binary Tree 倒置二叉树 思路:分别倒置左边和右边的结点,然后把根结点的左右指针分别指向右左倒置后返回的根结点. # Definition for ...
- 【一天一道LeetCode】#226. Invert Binary Tree
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 来源:http ...
- 【LeetCode】226. Invert Binary Tree 翻转二叉树(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 题目地址: https://lee ...
- LeetCode之226. Invert Binary Tree
------------------------------------- 反转树的基本操作. 可是下面那句话是什么鬼啊,这么牛掰的人都会有这种遭遇,确实抚慰了一点最近面试被拒的忧伤..... AC代 ...
- 【LeetCode】226 - Invert Binary Tree
Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 Notice: Goog ...
- Leet Code OJ 226. Invert Binary Tree [Difficulty: Easy]
题目: Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 思路分析: 题意是将二叉树全部左右子数 ...
- LeetCode OJ:Invert Binary Tree(反转二叉树)
Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 Trivia:This problem was ...
- LeetCode Javascript实现 258. Add Digits 104. Maximum Depth of Binary Tree 226. Invert Binary Tree
258. Add Digits Digit root 数根问题 /** * @param {number} num * @return {number} */ var addDigits = func ...
随机推荐
- Hive扩展功能(八)--表的索引
软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这三部机, 每部主机的用户名都为centos ...
- Hive扩展功能(七)--Hive On Spark
软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...
- html5——多媒体(一)
<audio> 1.autoplay 自动播放 2.controls 是否显不默认播放控件 3.loop 循环播放 4.preload 预加载 同时设置autoplay时些属性失效 5.由 ...
- STL_优先队列_(转载)
转自:http://www.cnblogs.com/summerRQ/articles/2470130.html STL容器之优先队列 优先级队列,以前刷题的时候用的比较熟,现在竟然我只能记得它的关键 ...
- HDU_1085_Holding Bin-Laden Captive!_母函数
Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- Git学习总结四(删除)
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了: $ rm test.txt 这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻 ...
- idea中配置xml不自动提示解决方案
1.打开设置File-->Settings(或者Ctrl + Alt + S)--->Languages&Frameworks-->Schemas and DTDS 2.选择 ...
- 关于img的一个小知识点
这两天在撸代码的时候发现图片的最下面总是会留一条空白,刚开始不知道为什么,但是UI拿刀对我说去掉它,瑟瑟发抖的我找了下原因及解决方案. 原因:img 是一个inline-block标签,而这个标签的v ...
- ThinkPHP5.1安装
安装 ====== 按照官方的推荐方式,推荐使用composer方式安装 TP5.1环境要求 PHP >= 5.6.0 PDO PHP Extension MBstring PHP Extens ...
- homework week 1
第一周的作业 首先来完成第二个作业, 编写登录接口, 因为视频上并没有相关的教程, 就在网上搜了一下读写文件的语句, 粗略了解. f1 = open("data.txt",&quo ...