【LeetCode】226. Invert Binary Tree 翻转二叉树(Python)
作者: 负雪明烛
 id: fuxuemingzhu
 个人博客: http://fuxuemingzhu.cn/
题目地址: https://leetcode.com/problems/invert-binary-tree/
题目描述
Invert a binary tree.
Example:
Input:
     4
   /   \
  2     7
 / \   / \
1   3 6   9
Output:
     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 f*** off.
题目大意
翻转二叉树。
解题方法
递归
这个题能够很好地帮助我们理解递归。
递归函数本身也是函数,调用递归函数就把它当做普通函数来看待,一定要只思考当前层的处理逻辑,明白该递归函数的输入输出是什么即可,调用的时候不要管函数内部实现。不要用肉脑 debug 递归函数的调用过程,会被绕进去。
首先来分析invertTree(TreeNode root)函数的定义:
- 函数的定义是什么?
该函数可以翻转一棵二叉树,即将二叉树中的每个节点的左右孩子都进行互换。 - 函数的输入是什么?
函数的输入是要被翻转的二叉树。 - 函数的输出是什么?
返回的结果就是已经翻转后的二叉树。 
然后我们来分析函数的写法:
- 递归终止的条件
当要翻转的节点是空,停止翻转,返回空节点。 - 返回值
虽然对root的左右子树都进行了翻转,但是翻转后的二叉树的根节点不变,故返回root节点。 - 函数内容
root节点的新的左子树:是翻转了的root.right=> 即root.left = invert(root.right);
root节点的新的右子树:是翻转了的root.left=> 即root.right = invert(root.left); 
至此,递归函数就写完了。在『函数内容』编写的时候,是不是把递归函数invertTree(TreeNode root)当做了普通函数来用?调用invertTree(TreeNode root)函数就是能实现翻转二叉树的目的,不需要理解函数内部怎么实现的。
最后,提醒大家避免踩一个小坑,不能直接写成下面这样的代码:
root.left = invert(root.right)
root.right = invert(root.left)
这是因为第一行修改了root.left,会影响了第二行。在 Python 中,正确的写法是把两行写在同一行,就能保证 root.left 和 root.right 的修改是同时进行的。
Python 解法如下:
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        if not root:
            return
        root.left, root.right = self.invertTree(root.right), self.invertTree(root.left)
        return root
迭代
使用迭代方法。众所周知,把递归改成迭代需要一个栈,这个题使用迭代基本就是套个模板就好了,关键步骤只有一行,那就是把两个子树进行翻转。
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        stack = []
        stack.append(root)
        while stack:
            node = stack.pop()
            if not node:
                continue
            node.left, node.right = node.right, node.left
            stack.append(node.left)
            stack.append(node.right)
        return root
日期
2016/4/29 21:58:13
 2018 年 10 月 8 日 —— 终于开学了。
 2018 年 11 月 9 日 —— 睡眠可以
【LeetCode】226. Invert Binary Tree 翻转二叉树(Python)的更多相关文章
- leetcode  226 Invert Binary Tree 翻转二叉树
		
大牛没有能做出来的题,我们要好好做一做 Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 Tri ...
 - 226. Invert Binary Tree 翻转二叉树
		
[抄题]: Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 [暴力解法]: 时间分析: 空间分 ...
 - [LintCode] Invert Binary Tree 翻转二叉树
		
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...
 - Leetcode 226 Invert Binary Tree python
		
题目: Invert a binary tree. 翻转二叉树. 递归,每次对节点的左右节点调用invertTree函数,直到叶节点. python中也没有swap函数,当然你可以写一个,不过pyth ...
 - [LeetCode] 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 wa ...
 - LeetCode 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 ...
 - LeetCode 226 Invert Binary Tree(转换二叉树)
		
翻译 将下图中上面的二叉树转换为以下的形式.详细为每一个左孩子节点和右孩子节点互换位置. 原文 如上图 分析 每次关于树的题目出错都在于边界条件上--所以这次细致多想了一遍: void swapNod ...
 - Leetcode 226 Invert Binary Tree 二叉树
		
交换左右叶子节点 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * ...
 - lintcode :Invert Binary Tree 翻转二叉树
		
题目: 翻转二叉树 翻转一棵二叉树 样例 1 1 / \ / \ 2 3 => 3 2 / \ 4 4 挑战 递归固然可行,能否写个非递归的? 解题: 递归比较简单,非递归待补充 Java程序: ...
 
随机推荐
- Linux图片查看软件ImageMagick安装
			
在Linux中查看图片,这个需求是非常常见的.总不至于在集群中生成个图片,随便看下效果,也要用filezilla.winscp之类的远程文件传输工具导过来导过去吧,这样效率太低. Linux图片查看常 ...
 - Can't connect to HTTPS URL because the SSL module is not available. - skipping
			
今天用pip3安装第三方库的时候报了这样一个错: Can't connect to HTTPS URL because the SSL module is not available. - skipp ...
 - (转载) Java多线程技术
			
多线程编程一直是学员们比较头痛和心虚的地方,因为线程执行顺序的不可预知性和调试时候的困难,让不少人在面对多线程的情况下选择了逃避,采用单线程的方式,其实只要我们对线程有了明确的认识,再加上java内置 ...
 - 添加页面、页面交互、动态添加页面tab
			
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ViewDictTosPr ...
 - CPU如何同时运行多个进程?
			
1 # -*- coding: utf-8 -*- 2 import re 3 mem = [x for x in re.split('[\r|\n]', ''' 4 store a 1 5 add ...
 - Redis6 新特性
			
Redis6新特性 ACL安全策略 ACL(access control list): 访问控制列表,可以设置多个用户,并且给每个用户单独设置命令权限和数据权限 default用户和使用require ...
 - 【leetcode】917. Reverse Only Letters(双指针)
			
Given a string s, reverse the string according to the following rules: All the characters that are n ...
 - 案例分析  CAN OPEN 调试记录 进度
			
2020.12.29 发现一片博客:https://blog.csdn.net/harrycomeon/article/details/94650103 需要一个硬件:CAN分析仪,网上200元左右. ...
 - spring认证的一些核心类
			
SecurityContextHolder, to provide access to the SecurityContext. SecurityContext: to hold the Authen ...
 - docker之镜像制作
			
#:下载镜像并初始化系统 root@ubuntu:~# docker pull centos #:创建目录 root@ubuntu:/opt# mkdir dockerfile/{web/{nginx ...