226. Invert Binary Tree

Total Accepted: 57653 Total
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

&lt;LeetCode OJ&gt; 226. Invert Binary Tree的更多相关文章

  1. 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 ...

  2. Python解Leetcode: 226. Invert Binary Tree

    leetcode 226. Invert Binary Tree 倒置二叉树 思路:分别倒置左边和右边的结点,然后把根结点的左右指针分别指向右左倒置后返回的根结点. # Definition for ...

  3. 【一天一道LeetCode】#226. Invert Binary Tree

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 来源:http ...

  4. 【LeetCode】226. Invert Binary Tree 翻转二叉树(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 题目地址: https://lee ...

  5. LeetCode之226. Invert Binary Tree

    ------------------------------------- 反转树的基本操作. 可是下面那句话是什么鬼啊,这么牛掰的人都会有这种遭遇,确实抚慰了一点最近面试被拒的忧伤..... AC代 ...

  6. 【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 ...

  7. 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 思路分析: 题意是将二叉树全部左右子数 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. HTML+CSS(12)

    n  CSS浮动和清除 Float:让元素浮动,取值:left(左浮动).right(右浮动). Clear:清除浮动,取值:left(清除左浮动).right(清除右浮动).both(同时清除上面的 ...

  2. 【技术累积】【点】【java】【28】Map遍历

    Map遍历 map的遍历一般有几种吧 遍历entrySet for(Map.Entry<String,String> entry : map.entrySet()){ } Iterator ...

  3. c#中通过事件实现按下回车跳转控件

    //接受用户输入参数后回车事件 private void tb_KeyPress(object sender, KeyPressEventArgs e) { ) { SendKeys.Send(&qu ...

  4. iptables详解(3):iptables规则管理

    所属分类:IPtables  Linux基础 在本博客中,从理论到实践,系统的介绍了iptables,如果你想要从头开始了解iptables,可以查看iptables文章列表,直达链接如下 iptab ...

  5. Uedior上传大文件超时报错

    出错原因: 1.php超时等待时间太短 2.uedior中设置了请求超时,提示信息: 上传失败,请重试 先解决第一个问题: 设置php.ini中的max_execution_time 为0 (意思是h ...

  6. JAVA中 redisTemplate 和 jedis的配合使用

    首先项目A,也就是SpringBOOT项目中使用redisTemplate 来做REDIS的缓存时,你会发现存到REDIS里边的KEY和VALUE,redisTemplat使用jdkSerialize ...

  7. selenium常用操作,查找元素,操作Cookie,获取截图,获取窗口信息,切换,执行js代码

    目录: 1. 常用操作 2. 查找元素 3. 操作Cookie 4. 获取截图 5. 获取窗口信息 6. 切换 7. 执行JS代码 简介 selenium.webdriver.remote.webdr ...

  8. 【[Offer收割]编程练习赛12 C】矩形分割

    [题目链接]:http://hihocoder.com/problemset/problem/1495 [题意] [题解] 把每个方块都再分成3*3的小块; 这样; 对于一个方块来说 如果是'\' 则 ...

  9. 清北学堂模拟赛d4t6 c

    分析:这道题比较有难度. 观察题目,发现只有当一行翻了奇数次后才会产生黑色格子,设有x行被翻了奇数次,y列被翻了偶数次,那么x*m + y*n - 2*x*y = s,接下来就要解方程了.对于二元一次 ...

  10. Spring Boot静态资源处理

    Spring Boot静态资源处理 8.8 Spring Boot静态资源处理 当使用Spring Boot来开发一个完整的系统时,我们往往需要用到前端页面,这就不可或缺地需要访问到静态资源,比如图片 ...