<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 ...
随机推荐
- Combox两级联动会经常出现的错误
例如: 当我们遇到这种情况:(下拉框的隐藏值和显示值皆为实体类进行绑定值时)下拉框的隐藏值并不能成功获取到. 我们就可以使用下面 的方案来解决 ok ,成功获取到隐藏值. 还有一个,附加解决方案:
- Laravel5.1学习笔记15 数据库1 数据库使用入门
简介 运行原生SQL查询 监听查询事件 数据库事务 使用多数据库连接 简介 Laravel makes connecting with databases and running queries e ...
- HashMap的尾部遍历问题--Tail Traversing
在看网上HashMap的resize()设计时,提到尾部遍历. JDK1.7的HashMap在实现resize()时,新table[]的列表采用LIFO方式,即队头插入.这样做的目的是:避免尾部遍 ...
- [ JSOI 2015 ] Salesman
\(\\\) \(Description\) 给出一棵以\(1\)为根的\(N\)个节点的树,开始的时候你在\(1\)号节点. 除了\(1\)号节点以外,每个点都有访问次数限制\(t_i\),即到达该 ...
- 【转】Centos7 ftp 配置及报错处理
原文链接: https://www.cnblogs.com/GaZeon/p/5393853.html Centos7网络配置,vsftpd安装及530报错解决 今天在虚拟机安装CentOS7,准备全 ...
- 笔记《精通css》第3章 盒模型,定位,浮动,清理
第3章 盒模型,定位,浮动,清理 1.盒模型用到的属性width,height,padding,border,margin 普通文档流的上下垂直margin会叠加 2.块级框 与 行内框, 利用 ...
- Android RecyclerView notifyDataSetChanged不起作用
一般listview设置完data后调用notifyDataSetChanged便可刷新布局界面,然而recycleview调用这个方法却没有任何反应.对于很多不熟悉recycleview的话很容易躺 ...
- Andorid Scrolling Activity(CoordinatorLayout详情)
1.new project -> Scrolling Activity 2.Layout xml code activity_scrolling.xml <?xml version=&qu ...
- [ Java ] [ UT ] [ Mock ] [ JUnit ] 單元測試的撰寫
最近新的專案用到很多的單元測試,對於單元測試有多了一歇的了解. 先寫下大綱,後面分篇寫出總結心得. 1. 單元測試要隔離對外部的關聯 2. Mock, spy 的用法時機差異 3. JUnit 4, ...
- JS高级——逻辑中断
1.表达式1||表达式2:表达式1为真,返回表达式1:表达式1为假,返回表达式2 2.表达式1&&表达2:表达式1为真,返回表达式2:表达式1为假,返回表达式1