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. jQuery封装的选项卡方法

    ********************************************************2018/3/15更新********************************* ...

  2. 亚马逊EC2构建代理服务器心血历程

    1.亚马逊上申请一台免费的EC2服务器,有相应的教程,绑定信用卡,预支付1美元,据说可以退回(防止到期后直接扣款,支付后通过修改卡信息,但好象有提示了,说卡不对了,也不管它了,到期后再说,美国人也不是 ...

  3. cordova科大讯飞语音识别

    cordova-plugin-IFlyspeech 科大讯飞的语音听说读写的cordova插件 Supported Platforms iOS android Installation 插件安装命令: ...

  4. mongoDB 删除集合后,空间不释放的解决方法

    mongoDB 删除集合后,空间不释放,添加新集合,没有重新利用之前删除集合所空出来的空间,也就是数据库大小只增不减. 方法有: 1.导出导入 dump & restore 2.修复数据库 r ...

  5. fastjson——json工具库

    fastjson alibaba fastjson是阿里巴巴公司开源维护的一个处理json格式数据的java工具库. 功能特性: 数据绑定databind (json string <--> ...

  6. [Windows Server 2008] 服务器安全加固

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:服务器安全加固 ...

  7. 4星|《JAC写给外贸公司老板的企管书》:善总结爱学习、有业绩的老外贸的经验谈

    作者从事外贸10余年,作出了业绩,也善总结.爱学习.爱分享.本书是作者在外贸行业的从业经验集.有一些战略方面的,比如开发小语种市场,大部分都是战术方面的操作细节(比如如何做营销),应该是非常适合从业者 ...

  8. BeginEditorCommand()

    BeginEditorCommand();开始把焦点给CAD CompleteEditorCommand();焦点给窗体

  9. CentOS下修改root用户名

    修改root登录用户名减少Linux云主机“被暴力破解”警告,登录云主机的时候就先显示登录失败多少次.其是公网有人在扫用弱密码破解登录. 所谓暴力破解,就是用“用户名“+”密码”穷举的方式进行远程登录 ...

  10. 集成学习_Bagging 和随机森林(rf)

       集成学习方式总共有3种:bagging-(RF).boosting-(GBDT/Adaboost/XGBOOST).stacking      下面将对Bagging 进行介绍:(如下图所示) ...