在树中动态插入和删除边

时间:2014-05-08 12:26:32

标签: algorithm data-structures tree

问题:给定一个包含T个节点的有根树N。每个节点的编号为1N,节点1是根节点。此外,每个节点都包含一些值。我们必须在给定的树中进行三种查询。

查询1 ::
给定节点nd,您必须找到以nd为根的子树的所有节点的值的总和并打印答案。

查询2 ::
给定节点nd,您必须完全删除以nd为根的子树(包括节点nd)。

查询3 ::
给定节点nd和某个整数v,您必须将一个子节点添加到值为nd的节点v

约束:N的大小为100000.查询总数也将是100000的订单。因此,我不能每次都进行DFS遍历。

我的想法:我的解决方案是离线。我将首先找到添加到树中的所有节点至少一次并创建相应的树。然后我将对树进行预先遍历并将其转换为数组,其中子树将始终连续出现。然后我可以使用段树数据结构来解决问题。因此,我的算法将是O( QlogN),其中Q是查询的总数。但是,我正在寻找一种高效的“在线”解决方案。我的意思是,我一问完就会执行每个查询。我不能先存储所有查询,然后逐个执行。

任何帮助都很受欢迎! 感谢。

1 个答案:

答案 0 :(得分:0)

假设树是平衡的,每个节点有两个额外的参数,你可以在o(qlogn)中解决它。

每个节点都保持一个和,其值将等于根据该子树的节点中的节点值的总和,并保持父节点。

根据上述两个要求,查询一个只是简化为返回和加上该节点的值(o(1))。查询二简化为从该节点的每个父节点减去和加上节点的值,直到到达根(o(logn))。查询三只是简化为向该节点的每个父节点添加v,直到到达根(o(logn))。