理解递归二叉树操作中的代码行为和变量名称

问题描述 投票:0回答:1

我正在研究 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
这样的变量名称不应该只是相同值的引用持有者吗?当我更改变量名称时,可能是什么导致了这种意外行为?

提前致谢

python recursion data-structures tree binary-search-tree
1个回答
0
投票

区别在于这段代码执行时的情况:

        if not root.left and not root.right and root.val == target:
            root = None
            return 

这是在

root
函数中对局部变量
dfs()
进行赋值,而不是对main函数中的变量进行赋值。因此,当主函数执行
return root
时,它会返回
root
的原始值,而不是
None

© www.soinside.com 2019 - 2024. All rights reserved.