我正在研究 LeetCode 问题 1325,“删除具有给定值的叶子”,并且我在代码中遇到了一个我正在尝试理解的问题。
在我的代码中,我正在实现一种递归方法来删除二叉树中具有给定目标值的叶节点。我注意到,与返回
root
函数的结果相比,直接在主函数中返回 dfs
时的行为有所不同。
以下是两个代码片段供参考:
问题1:
代码片段1:直接返回
root
def removeLeafNodes(self, root: Optional[TreeNode], target: int) -> Optional[TreeNode]:
def dfs(root, target):
if root is None:
return None
root.left = dfs(root.left, target)
root.right = dfs(root.right, target)
if not root.left and not root.right and root.val == target:
root = None
return
return root
dfs(root, target)
return root
代码片段2:返回
dfs
的结果
def removeLeafNodes(self, root: Optional[TreeNode], target: int) -> Optional[TreeNode]:
def dfs(root, target):
if root is None:
return None
root.left = dfs(root.left, target)
root.right = dfs(root.right, target)
if not root.left and not root.right and root.val == target:
root = None
return
return root
return dfs(root, target)
我的问题是:直接在主函数中返回
root
和返回 dfs
函数的结果之间的行为有什么区别?为什么第一种方法在某些情况下不能按预期工作,例如 [1,1]
,它将树转换为 [1] 而不是预期的空树 []
?
问题 2:递归代码中的变量名称
我还注意到变量名称的一个有趣问题。当我最初在递归函数中使用
root.left
和 root.right
时,代码运行正确。但是,当我尝试将变量名称更改为 root_left
和 root_right
时,如下所示:
root_left = dfs(root.left, target)
root_right = dfs(root.right, target)
所有测试用例的代码都开始失败。
我的问题是:像
root_left
和 root_right
这样的变量名称不应该只是相同值的引用持有者吗?当我更改变量名称时,可能是什么导致了这种意外行为?
提前致谢
区别在于这段代码执行时的情况:
if not root.left and not root.right and root.val == target:
root = None
return
这是在
root
函数中对局部变量dfs()
进行赋值,而不是对main函数中的变量进行赋值。因此,当主函数执行 return root
时,它会返回 root
的原始值,而不是 None
。