假设我想要更改以下树中的orange node
。
因此,我需要进行的唯一其他更改是left pointer
的{{1}}。
green node
将保持不变。
我在某处错了吗? 因为根据this article(解释zippers),甚至需要更改蓝色节点。< / p>
同样,在same article, 中的这张图片(重新着色)中,我们为什么要更改橙色节点(当我们更改节点blue node
时)?
答案 0 :(得分:4)
在命令式语言中,您是正确的,只需要更改绿色节点。但是对于纯粹的功能数据结构,情况并非如此。要更改橙色节点,您需要更改绿色节点。因为您更改了绿色节点,所以需要更改蓝色节点(依此类推)。实际上, change 这个词是不正确的,你真的是在复制相关数据并创建一个新节点。因此蓝色节点没有被改变,因为正在创建一个新的蓝色节点(指向新的绿色节点)。
这样做可以维护持久性,这意味着您可以存储树的所有先前状态。如果您想在更改橙色节点之前存储树,并且在更改橙色节点之后,您需要更改绿色和蓝色 - 否则两者都将是同一树的副本。
在第二种情况下,同样适用,只是现在你还需要更改父指针。由于您已更改根节点,因此所有橙色节点都需要将其父指针设置为指向其新父节点。
编辑:澄清一下,想一想这样。在纯函数式语言中,您无法修改任何内容,只能创建新节点或复制它们。因此,当您想要更改橙色节点时,您实际上会使用不同的数据(“更改”)复制它。现在您需要绿色节点指向橙色节点,这需要您创建一个新的橙色节点 - 这个节点指向新的绿色节点。蓝色节点也是如此。