在树中搜索具有特定属性的节点并分配树的属性的有效方法
Efficient way to search for a node with a specific attribute in a tree and assign the attributes of the tree
我有一棵树。例如下面一个:
根
a
/ \
b c
/ \ / \
e d f g
树中的每个节点都有一个属性attr1
。如果一个节点的 attr1
的值为 1。那么到该节点的路径上所有节点的 attr2
(另一个属性)应该为 1。但是我们不知道是否有任何一个节点在其 attr1
.
中的值为 1
我要解决这个问题的想法是遍历树(预购)。在遍历时,我将有一个 FIFO
容器 (queue
),每次我向下移动时,我都会添加到队列中,而当向上移动时,我将删除下面的节点。所以我总是有当前节点的路径。那么如果节点有attr1 == 1
,那么我必须再次迭代路径,将路径中所有节点的attr2
设置为2.
但是不知道有没有更高效的方式来实现?
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
(n2)。至于每个节点,你都要遍历队列,if attr1==1
for each node.
但是,在上面的代码中,复杂度最多为 O(n)
。因为您只访问每个节点一次。
我有一棵树。例如下面一个: 根
a
/ \
b c
/ \ / \
e d f g
树中的每个节点都有一个属性attr1
。如果一个节点的 attr1
的值为 1。那么到该节点的路径上所有节点的 attr2
(另一个属性)应该为 1。但是我们不知道是否有任何一个节点在其 attr1
.
中的值为 1
我要解决这个问题的想法是遍历树(预购)。在遍历时,我将有一个 FIFO
容器 (queue
),每次我向下移动时,我都会添加到队列中,而当向上移动时,我将删除下面的节点。所以我总是有当前节点的路径。那么如果节点有attr1 == 1
,那么我必须再次迭代路径,将路径中所有节点的attr2
设置为2.
但是不知道有没有更高效的方式来实现?
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
(n2)。至于每个节点,你都要遍历队列,if attr1==1
for each node.
但是,在上面的代码中,复杂度最多为 O(n)
。因为您只访问每个节点一次。