python - Python 中的引用问题(树)

标签 python pointers reference tree

我正在尝试删除所有仅包含零的子树。我的代码如下。现在,在根节点上运行removeFailures根本不会修改树(前后进行前序遍历会得到相同的结果)。

我认为这是因为当我说“root is None”时,我实际上并没有修改 root,我只是创建一个临时变量名称 root 可能吗?如果是这样的话我该如何解决这个问题?这个推理在 Java 中行不通吗?

    # Ex.
    #           4                      4
    #        /     \                /      \
    #       1       3              1        3
    #       / \    / \     -->    /       /  \
    #      0   0  4  6           0       4   6
    #     /\  /\                / \
    #    3 5 0  0              3  5


    class TreeNode:
        def __init__(self, data, left=None, right=None):
            self.data = data
            self.left = left
            self.right = right


    def removeFailures(root):
        if root is None:
            return True

        removeLeft = removeFailures(root.left)
        removeRight = removeFailures(root.right)
        if root.data == 0 and removeLeft and removeRight:
            root = None
            return True
        return False


    def preorder(root):
        print root.data
        if root.left:
            preorder(root.left)
        if root.right:
            preorder(root.right)

    example = TreeNode(4)
    example.left = TreeNode(1, TreeNode(0, TreeNode(3), TreeNode(5)), TreeNode(0, TreeNode(0), TreeNode(0)))
    example.right = TreeNode(3, TreeNode(4), TreeNode(6))
    preorder(example)
    print '*************************'

    removeFailures(example)

    preorder(example) #TODO

最佳答案

要检查树中的所有节点是否包含零,您必须循环遍历每个节点。一种可能性是创建一个 __iter__ 方法来查找树中的所有节点,然后可以应用 any 内置函数来确定它们是否都等于零。最后,一个简单的递归方法可以检查左右子节点,并在必要时删除。

为了简化创建树的过程,使用 kwargs 就地构建结构,而无需实现旋转方法或一长串赋值语句:

class Tree:
  def __init__(self, **kwargs):
    self.__dict__ = {i:kwargs.get(i) for i in ['left', 'right', 'val']}
  def __iter__(self):
    yield self.val
    yield from ([] if self.left is None else self.left)
    yield from ([] if self.right is None else self.right)
  @staticmethod
  def remove_empty_trees(_t):
    if not any(_t):
       return None
    _t.remove_trees()
    return _t
  def remove_trees(self):
    if not any([] if self.left is None else self.left):
       self.left = None
    else:
       self.left.remove_trees()
    if not any([] if self.right is None else self.right):
       self.right = None
    else:
       self.right.remove_trees()
<小时/>
#           4         
#        /     \    
#       1       3 
#       / \    / \  
#      0   0  4  6
#     /\  /\            
#    3 5 0  0
t = Tree(val=4, left=Tree(val=1, left=Tree(val=0, left=Tree(val=3), right=Tree(val=5)), right=Tree(val=0, left=Tree(val=0), right=Tree(val=0))), right=Tree(val=3, left=Tree(val=4), right=Tree(val=6)))
new_tree = Tree.remove_empty_trees(t)
print(print(new_tree.left.right))

输出:

None

为了处理整个树包含零节点的情况,staticmethod 提供了额外的检查。

关于python - Python 中的引用问题(树),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52865197/

相关文章:

python - 为什么在 self.assertEqual 签名中调用字典键时出现 KeyError ?

python - 如何使用 Sobel 算子在图像中查找基本形状(砖 block 、圆柱体、球体)?

c - 结构指针的这种使用正确吗?

Java在替换(不更改)对象时自动更新所有引用?

python - 用于在 Python 中构建 PriorityQueue 的自定义比较器

python - Scipy Peak_widths 返回类型错误 : only integer scalar arrays can be converted to a scalar index

c++ - 向后移动下一个节点函数

C++——空指针

c++ - 引用成员的初始化需要一个临时变量

reference - 如何区分常量列表和动态创建的列表?