Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 更改二叉树中节点的效果_Algorithm_Data Structures_Tree_Binary Tree_Zipper - Fatal编程技术网

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具有变量相同的变量。纯函数语言中的变量一旦设置就不能更改。此外,二叉树不一定是纯函数的,它们只是很容易用纯函数的方式表示。当有人提到纯功能数据结构时,他们通常指的是以纯功能方式实现的特定数据结构,这意味着更新是非破坏性的(不是更改数据结构,而是使用相关更改复制数据结构)。