Algorithm 更改二叉树中节点的效果
假设我想更改下面树中的Algorithm 更改二叉树中节点的效果,algorithm,data-structures,tree,binary-tree,zipper,Algorithm,Data Structures,Tree,Binary Tree,Zipper,假设我想更改下面树中的橙色节点 因此,我需要做的唯一其他更改是绿色节点的左指针 蓝色节点将保持不变 我在什么地方错了吗?因为根据(这就解释了),即使是蓝色节点也需要更改 类似地,在这张图片(重新着色)中,为什么我们要更改橙色节点(当我们更改节点x)? 在命令式语言中,您是正确的,只需更改绿色节点。但是,对于纯功能数据结构,情况并非如此。要更改橙色节点,需要更改绿色节点。由于更改了绿色节点,因此需要更改蓝色节点(依此类推)。实际上单词change是不正确的,您实际上是在复制相关数据并创建一个新节
橙色节点
因此,我需要做的唯一其他更改是绿色节点的左指针
蓝色节点将保持不变
我在什么地方错了吗?因为根据(这就解释了),即使是蓝色节点也需要更改
类似地,在这张图片(重新着色)中,为什么我们要更改橙色节点(当我们更改节点x
)?
在命令式语言中,您是正确的,只需更改绿色节点。但是,对于纯功能数据结构,情况并非如此。要更改橙色节点,需要更改绿色节点。由于更改了绿色节点,因此需要更改蓝色节点(依此类推)。实际上单词change是不正确的,您实际上是在复制相关数据并创建一个新节点。因此,蓝色节点没有被更改,而是创建了一个新的蓝色节点(指向新的绿色节点)
这样做可以保持持久性,这意味着您可以存储树的所有以前的状态。如果要在更改橙色节点之前和更改橙色节点之后存储树,则需要同时更改绿色和蓝色,否则两者都将是同一棵树的副本
在第二种情况下,同样的情况也适用,只是现在还需要更改父指针。由于更改了根节点,所有橙色节点都需要将其父指针设置为指向其新父节点
编辑:为了澄清一点,可以这样想。在纯函数式语言中,您不能修改任何内容,只能创建新节点或复制它们。因此,当您想要更改橙色节点时,实际上需要使用不同的数据对其进行复制(“更改”)。现在,您需要绿色节点指向橙色节点,这需要您创建一个新的橙色节点-该节点指向新的绿色节点。蓝色节点也是如此。因此,您不是更新节点上的相关属性,而是创建新节点并将其连接起来/确切地纯函数式语言没有可变类型,所以这是您唯一的选择。OP引用的这篇文章是关于zippers的,它是函数式编程中常用的一种树。@Niki:谢谢你的解释。我了解一些事情,但仍然有一些疑问。首先,命令式编程和函数式编程有什么区别?什么是功能数据结构?简单的二叉树也是功能数据结构吗?上一句话有意义吗?谷歌和维基百科可能会为你提供更多的信息(并以一种好的方式占用你几小时的生命),但这里有一些基本的东西:大多数编程语言都是强制性的,这意味着它们依赖于改变程序状态的语句。C、C++、Python、Ruby等都是命令式的或包含命令式的。函数式语言依赖于“数学”函数,没有状态。换句话说,实际上并不存在任何与Python具有变量相同的变量。纯函数语言中的变量一旦设置就不能更改。此外,二叉树不一定是纯函数的,它们只是很容易用纯函数的方式表示。当有人提到纯功能数据结构时,他们通常指的是以纯功能方式实现的特定数据结构,这意味着更新是非破坏性的(不是更改数据结构,而是使用相关更改复制数据结构)。