Invert Binary Tree --- Python --- LeetCode

1. 问题描述

LeetCode第226题,题目名称为二叉树翻转

triv·i·a : details, considerations, or pieces of information of little importance or value. 翻译为细节,无用的细节

 

2. 思考

# 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
        """

2.1 这类传入一个root的,首先要判断root是否是None

2.2 翻转根节点为root的二叉树,将问题分解为翻转根节点为root.left的二叉树,翻转根节点为root.right的二叉树,交换root节点左右子树。

翻转根节点为root的二叉树  =  翻转根节点为root.left的二叉树 (问题的自相似性,使用递归 recursive 解决)

+ 翻转根节点为root.right的二叉树 (问题的自相似性,使用递归解决)

+ 交换root节点左右子树

2.3 思考递归结束条件

一个根节点左右子树都不存在,翻转该节点没有意义,直接返回该节点就可以了

或者

这个根节点本身就不存在(这就是2.1 描述的情况),直接返回None就可以了

 

3. 问题解决方案

 

# 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 None

        if root.left or root.right:
            root.left, root.right = self.invertTree(root.right), self.invertTree(root.left)
        return root

 

3.1 重构代码

def invertTree(self, root):
    #就假设root存在,如果不存在 该段代码默认返回None
    if root:
        root.left, root.right = self.invertTree(root.right), self.invertTree(root.left)
    return root

3.2 自己建一个stack,模拟系统维护的call stack, 

  这其实就是DFS,这个DFS的顺序是从树的右子树进行不停的深入,但是由于树的左右子树交换了位置,所以在可视化里面看起来像一直从树的左子树不停的深入

 

# DFS
def invertTree(self, root):
   #stack初始化
    stack = [root]
    while stack:
        #循环做如下动作:pop会删除list末尾的元素,做操作,新的元素也加在list末尾
        node = stack.pop()
        if node:
            node.left, node.right = node.right, node.left
            stack += node.left, node.right  #向stack中加入待处理节点
    return root    

 

  

 

3.3 自己建一个queue,

  可以实现BFS,先append 左子树,再append右子树,所以整个遍历过程是从左到右一层一层的遍历的

# BFS
def invertTree2(self, root):
    queue = collections.deque([(root)])
    while queue:
        node = queue.popleft()
        if node:
            node.left, node.right = node.right, node.left
            queue.append(node.left)           #向queue中加入待处理节点
            queue.append(node.right)     
    return root

  

4. 代码可视化

 

4.1 DFS

     4          
   /   \
  2     7       stack = [4]     stack中存储需要翻转的节点
 / \   / \
1   3 6   9
---------> 
     4
   /   \
  7     2      stack = [2, 7]    
 / \   / \
6   9 1   3
---------> 
     4
   /   \
  7     2      stack = [2, 6, 9]    
 / \   / \
9   6 1   3

这样的结构准确描述翻转的过程,后面就不详细画了

 

5. 参考链接

3中的重构代码,自己建一个stack均来自于LeetCode Discuss

3中的BFS方法来自于LeetCode Discuss

转载于:https://www.cnblogs.com/eeechoo/p/8283137.html

### 回答1: 如果您的 `fbset` 版本不支持 `-invert` 选项,则可以尝试使用以下方法翻转fb设备的颜色: 1. 使用以下命令备份您的fb设备的显示模式参数: ``` fbset -fb /dev/fb0 -xres -yres -vxres -vyres -depth -left -right -upper -lower > fbmode.txt ``` 2. 通过以下命令获取您的fb设备的分辨率: ``` fbset -s | grep "^mode" | awk '{print $2 " " $3}' ``` 3. 通过以下命令翻转颜色: ``` echo 1 > /proc/sys/dev/fb0/invert_display ``` 或者: ``` echo 1 > /sys/devices/virtual/graphics/fb0/invert_display ``` 如果以上两个命令都不行,您也可以尝试使用以下命令: ``` dd if=/dev/graphics/fb0 of=/dev/graphics/fb0 bs=2M count=1 conv=notrunc ``` 4. 如果您想恢复原来的颜色,请使用以下命令: ``` echo 0 > /proc/sys/dev/fb0/invert_display ``` 或者: ``` echo 0 > /sys/devices/virtual/graphics/fb0/invert_display ``` 如果以上两个命令都不行,您也可以尝试使用以下命令: ``` dd if=/dev/graphics/fb0 of=/dev/graphics/fb0 bs=2M count=1 conv=notrunc ``` 请注意,这些方法都需要root权限才能执行。 ### 回答2: 没有-invert表示没有反转。在计算机图形学中,常用-invert参数表示不对图像进行反转操作。这意味着图像将保持原始的亮度和颜色值,不发生颜色的逆转。例如,在处理照片时,可以使用-invert参数来保持图像的原始色调,而不对其进行颜色的反转。 另一方面,-invert也可以表示没有倒置或颠倒。在日常生活中,倒置常常表示将物体或概念颠倒或翻转。而若没有-invert,就表示没有发生颠倒。例如,如果我们谈论一个物体没有被颠倒,表示它仍然保持着正常的状态。 因此,"没有-invert"可以理解为保持原始状态,不进行反转或颠倒操作。无论是在计算机图形学中的处理,还是在日常生活中对物体状态的描述,都强调了某个属性没有发生变化或转化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值