需要用到可持久化数据结构的题目大多数都是单点修改,因此这里我们先只讨论单点修改.

我们先考察普通的线段树是怎么对某一段序列建线段树的(下图的白色节点)。

现在假设我们想修改 88 号节点,在普通线段树里,我们一路递归到 88 号节点,在 88 号节点上作出修改,再一路返回 4,2,14,2,1 更新修改. 例如如果我们的线段树维护的是区间和,那么在修改完 88 号节点后,线段树会一路返回 4,2,14,2,1 并在这些节点上维护修改过后的区间和.

我们发现,对于一次单点修改,真正发生改变的节点只有 O(logn)O(\log n) 个. 所以,我们可以这样维护出一个新版本:假设我们有旧版本 ii,对于从根节点开始的 O(logn)O(\log n) 个节点,先复制一份,然后根据要修改的位置选择在左儿子或者右儿子的位置创建新节点.