目录
一、背景
1.1问题
1.2原因
二、解构赋值
2.1定义
2.2解题应用
2.2.1翻转二叉树
2.2.2 思路以及代码
一、背景
1.1问题
在写二叉树相关代码赋值的时候发现这样的写法,担心会发生这样的情况:先把node.right的值给node.left,在把node.left的值给node.right,会发生覆盖问题,即node.right和node.left的值都是node.right。
1.2原因
经过查阅,但其实不会覆盖原有的值,Python 的解释器是按照顺序依次执行的,先计算等号右边的表达式,然后再将结果赋值给等号左边的变量。
所以上述图片中代码其实相当于
temp = (node.right, node.left)
node.left = temp[0]
node.right = temp[1]
这是一种非常常见的 Python 操作,被称为解构赋值(destructuring assignment)。
二、解构赋值
2.1定义
解构赋值(destructuring assignment):它可以将多个变量同时赋值给多个值,而无需使用额外的临时变量。
2.2解题应用
2.2.1翻转二叉树
题目来源:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
要求:
2.2.2 思路以及代码
(1)解题思路:
通过广度优先搜索遍历二叉树的每个节点,并在遍历过程中不断交换每个节点的左右子节点,从而实现了翻转二叉树
(2)代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return
result = []
queue = [root]
while queue:
level_size = len(queue)
current_level = []
for i in range(level_size):
node = queue.pop(0)
node.left, node.right = node.right, node.left
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return root
(3)代码解释:
-
首先,检查根节点
root
是否为空,如果为空,则直接返回。 -
创建一个空列表
result
,用于存储遍历后的结果。 -
创建一个队列
queue
,并将根节点root
添加到队列中。 -
进入循环,循环条件为队列不为空。这个循环用于进行广度优先搜索遍历二叉树的每个节点。
-
在每一层的循环中,首先获取当前层的节点数量
level_size
,用于控制内层循环的迭代次数。 -
创建一个空列表
current_level
,用于存储当前层的节点。 -
在内层循环中,通过
pop(0)
操作从队列中取出一个节点,并将该节点的左右子节点交换位置。 -
如果节点的左子节点存在,则将左子节点加入队列
queue
。 -
如果节点的右子节点存在,则将右子节点加入队列
queue
。 -
循环结束后,返回翻转后的二叉树的根节点
root
。