226. Invert Binary Tree

Total Accepted: 57653 Total
Submissions: 136144 Difficulty: Easy

Invert a binary tree.

  1. 4
  2. / \
  3. 2 7
  4. / \ / \
  5. 1 3 6 9

to

  1. 4
  2. / \
  3. 7 2
  4. / \ / \
  5. 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)控制反复的逻辑

以上已完毕

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10.  
  11. class Solution {
  12. public:
  13. //将根节点反转,并获取翻转后该根节点的指针
  14. TreeNode* invertTree(TreeNode* root) {
  15. if(root == NULL){
  16. return NULL;
  17. }else{
  18. //这样做将:树的底层先被真正交换,然后其上一层才做反转
  19. TreeNode* newleft = invertTree(root->right);
  20. TreeNode* newright = invertTree(root->left);
  21. root->left = newleft;
  22. root->right = newright;
  23. return root;
  24. }
  25. }
  26. };

事实上这个给定形式应该能猜測出,终于我们将二叉树反转后返回的肯定是根节点的指针,那么考虑用递归的话。每一次反转后返回的就是已经被反转后的子树的根节点,即先反转再返回那么直译就是后序式递归方法了,待我好好总结下这些该死的二叉树递归问题。

/************************************************多天后的华丽切割线********************************************************/

多天之后再来吊打此问题,用迭代法来做:

2。层序遍历。交换当前根节点的左右子树:

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. //思路首先:用迭代来做
  11. //从上往下左右子树相互交换,层序(广度优先)遍历
  12. class Solution {
  13. public:
  14. void swapNode(TreeNode* root)
  15. {
  16. TreeNode* newleft=root->right;
  17. TreeNode* newright=root->left;
  18. root->left=newleft;
  19. root->right=newright;
  20. }
  21. TreeNode* invertTree(TreeNode* root) {
  22. if(root==NULL)
  23. return NULL;
  24. //广度优先遍历交换两个子树
  25. queue<TreeNode*> que;
  26. TreeNode* curNode=root;
  27. que.push(curNode);
  28. while (!que.empty())
  29. {
  30. curNode=que.front();//出队首元素
  31. que.pop();//删除队首元素
  32. swapNode(curNode);
  33. if(curNode->left!=NULL)
  34. que.push(curNode->left);
  35. if(curNode->right!=NULL)
  36. que.push(curNode->right);
  37. }
  38. return root;
  39. }
  40. };

3,前序式深度优先搜索。

交换当前根节点的左右子树:

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. //思路首先:用迭代来做
  11. //从上往下左右子树相互交换,利用前序式深度优先搜索
  12. class Solution {
  13. public:
  14. void swapNode(TreeNode* root)
  15. {
  16. TreeNode* newleft=root->right;
  17. TreeNode* newright=root->left;
  18. root->left=newleft;
  19. root->right=newright;
  20. }
  21. TreeNode* invertTree(TreeNode* root) {
  22. if(root==NULL)
  23. return NULL;
  24. //前序式深度优先搜索遍历交换两个子树
  25. stack<TreeNode*> stk;
  26. TreeNode* curNode=root;
  27. stk.push(curNode);
  28. while (!stk.empty())
  29. {
  30. curNode=stk.top();//出队首元素
  31. stk.pop();//删除队首元素
  32. swapNode(curNode);
  33. if(curNode->left!=NULL)
  34. stk.push(curNode->left);
  35. if(curNode->right!=NULL)
  36. stk.push(curNode->right);
  37. }
  38. return root;
  39. }
  40. };

參考资源:

【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. Less文件的建立

    1.打开DreamWeaver 2.选择 新建 Less       文件名为.less,保存于Less文件夹中 3.声明文档头:@charset "utf-8"; 4.将Less ...

  2. 基于openstack平台的几种Cloud DB解决方案

    方案一.openstack 官方 trove解决方案 此方案进行过镜像的打包,由于网络问题,还未能成功实现 方案二.salt 或者ansible+ docker 由于 docker部署数据库,在数据库 ...

  3. JS——event

    触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息: 普通浏览器支持 event(传参),IE678支持 window.event(无参),兼容写法: < ...

  4. Java 基础入门随笔(2) JavaSE版——关键字、进制转换、类型转换

    1.Java语言-关键字 关键字:被java语言赋予了特殊含义的词,特点是所有的字母都为小写. java涉及到的关键字整理: 用于定义数据类型的关键字 class interface byte sho ...

  5. 文件下载之ServletOutputStream

    使用response.getOutputStream可以获取ServletOutputStream,从而实现向页面发送流数据.但是需要注意的是,不能使用ajax进行请求,因为这样页面不会有任何反应,可 ...

  6. bat配置JDK环境变量

    最近总是部署服务器,总是要安装配置JDK,今天就想写个bat来配置JDK的环境变量,首先介绍点bat的小知识 @符号后面的命令不会显示在terminal上 例如: @echo运行时 隐藏命令(不在te ...

  7. linux中的umask命令

    转载:http://blog.51cto.com/1123697506/882064 一 权限掩码umask umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不 ...

  8. 从CSV文件中读取jpg图片的URL地址并多线程批量下载

    很多时候,我们的网站上传图片时并没有根据内容进行文件夹分类,甚至会直接存储到阿里云的OSS或是七牛云等云存储上.这样,当我们需要打包图片时,就需要从数据库找寻分类图片,通过CURL进行下载.我最近刚刚 ...

  9. 发现:Click事件也能获取鼠标单击的坐标

    按照MSDN的说明以及平时的习惯,我们要获取鼠标单击时的相对坐标,都会使用MouseClick等事件,今天,偶然发现,原来Click事件也可以. /* 惊天地泣鬼神的考古业绩. * 原来Cilck事件 ...

  10. 3 numpy模块

    Numpy     什么是Numpy:Numeric Python         Numpy模块是Python的一种开源的数值计算扩展.             1 一个强大的N维数组对象Array ...