使用python二进制树修剪[postorder方法不起作用]

时间:2018-04-25 02:46:13

标签: python python-3.x algorithm binary-tree inorder

这是一个修剪二叉树的算法。例如:

    1                      1
   / \                      \
  0   1          =>          1
 / \ / \                      \
0  00   1                      1

我已经有了一个处理这个问题的递归方法,即

def pruneTree_recursion(root):
    if root is None:
        return None
    root.left = pruneTree_recursion(root.left)
    root.right = pruneTree_recursion(root.right)
    return root if root.val == 1 or root.left or root.right else None

但我还有另一种处理这个问题的方法,也就是使用postorder来逐一减少假期。

def pruneTree(root):
        def postorder(root, orderlist):
            if root:
                postorder(root.left, orderlist)
                postorder(root.right, orderlist)
                orderlist.append(root)
            return orderlist
        orderlist = postorder(root, [])
        for node in orderlist:
            if node.val == 0:
                if (node.left is None) and (node.right is None):
                    node = None   # May be the problem is here [1]
        return root

如果我将[1]中的代码更改为node.val = 88,则可行。每个地方需要削减将变为88.但是当我使用node = None时。它不起作用。树仍然是原始树。这是怎么出现的?如何解决它。谢谢任何人都可以帮助我。

1 个答案:

答案 0 :(得分:1)

事实上,你的递归方法也使用了postorder的想法。它有点像同样的想法,但你尝试用不同的方式实现它。 你的主要问题就像jasonharper所说的那样。 例如:

a = [[1], [2]]
for list in a:
    list = []

a仍然是[[1], [2]],但请记住,list不是不可变对象。 因此,如果你这样编码:

a = [[1], [2]]
for list in a:
    list.append(1)

a将是[[1,1],[2,1]]。这就是为什么node.val可能会更改值而不是node