这是一个修剪二叉树的算法。例如:
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
时。它不起作用。树仍然是原始树。这是怎么出现的?如何解决它。谢谢任何人都可以帮助我。
答案 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
。