在树中搜索具有特定属性的节点并分配树的属性的有效方法

时间:2018-03-07 18:25:14

标签: algorithm tree tree-traversal

我有一棵树。例如以下一个: 根

      a
    /   \
   b     c
  / \   / \
 e   d f   g

树中的每个节点都有一个属性attr1。如果节点的attr1的值为1.那么此节点路径上所有节点的attr2(另一个属性)应该为1.但我们不知道是否有任何节点节点在attr1中的值为1 我必须解决问题的想法是,遍历树(预订)。遍历时我将有一个FIFO容器(queue),每次我向下移动时都会添加到队列中,当向上移动时,我将删除下面的节点。所以我总是通往当前节点的路径。如果那时节点有attr1 == 1,那么我必须再次迭代路径并将路径中所有节点的attr2设置为2.
但我不知道是否有更有效的方法来实现这一目标?

1 个答案:

答案 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)。因为您只访问每个节点一次。