我有一棵树。例如以下一个: 根
a
/ \
b c
/ \ / \
e d f g
树中的每个节点都有一个属性attr1
。如果节点的attr1
的值为1.那么此节点路径上所有节点的attr2
(另一个属性)应该为1.但我们不知道是否有任何节点节点在attr1
中的值为1
我必须解决问题的想法是,遍历树(预订)。遍历时我将有一个FIFO
容器(queue
),每次我向下移动时都会添加到队列中,当向上移动时,我将删除下面的节点。所以我总是通往当前节点的路径。如果那时节点有attr1 == 1
,那么我必须再次迭代路径并将路径中所有节点的attr2
设置为2.
但我不知道是否有更有效的方法来实现这一目标?
答案 0 :(得分:1)
def update(node):
if node is None:
return False
upd_left = update(node.left)
upd_right = update(node.right)
node.attr2 = 1 if upd_left or upd_right or node.attr1 == 1 else node.attr2
return node.attr2 == 1
我认为这会做你所期望的,因为我们不会一次又一次地遍历队列。
如果是倾斜的树,您的方法的最坏情况复杂性将是O
(n 2 )。对于每个节点,如果每个节点都attr1==1
,则必须遍历队列。
但是,在上面的代码中,复杂性将至少为O(n)
。因为您只访问每个节点一次。