关于 copying/taking 二叉树中的一个节点的问题
problem regarding copying/taking a node from the binary tree
question(language used - js) - 当你从二叉树中复制一个节点时,该节点下的整个分支是什么(你知道二叉树节点有属性 left
和 right
,在它们下面,是更多的节点。)也被复制到变量中?好吧... node
是二叉树中的一个对象...并且 objects
是 reference values
,所以我猜测树的相同 node
排在那里, 而不是 copy of that node
.
我正在尝试在二叉树中执行 breadthFirstSearch
,我必须将树的 node
放在 queue
中。我想知道,当我 enqueue
queue
中 binary tree
的 node
时,是那个特定 node
及其 [=26] 的副本=] 或 properties
(正如我们所知)被添加到 queue
或仅添加了对 node
的引用?因为如果那个特定的节点被复制,并且树中有 1000 个节点,那么 node
下面的整个分支也可能被复制(因为我不知道这是否真的发生了)...... .这对性能和内存非常不利。如果它只引用那个节点,那么它完全没问题,因为我没有复制树的整个分支。
JavaScript 通过引用分配 objects 和 arrays,这意味着给定的对象或数组可以分配给任何数字变量而不复制它。
此外,对象和数组是可变的,这意味着您可以在创建后修改它们的内容。
例如:
a = [1,2,3]; // a is a reference to a freshly created array
b = a; // b is a second reference to the same array
a.pop(); // a is used to remove the last element of the underlying array
console.log (b); // b is also affected
输出:
Array [ 1, 2 ] // through `a` we modified the contents of `b`.
正如您所指出的,可变性的主要优点是效率。
另一方面,使用可变对象是棘手的,因为您要负责保证引用的一致性(用外行的话来说,您经常冒着无意中通过某些 'b' 破坏某些内容的风险 'a').
由于 JavaScript 对 variable typing 的概念非常有限,因此没有简单的方法可以判断哪个标识符允许在某个时间点访问和修改给定的数据。
定义相等的概念也很困难:我们是在谈论引用相等(a 和 b 引用相同的底层对象)还是内容相等(a 和 b 引用恰好包含相同数据的两个不同对象)?
这个陷阱是无数令人费解的错误的根源。
更糟糕的是,内置方法提供了多种方法。例如,一些可链式数组方法(filter
、map
、reduce
、find
)return 新数组,其他(pop
/push
, shift
/unshift
, splice
, sort
) 原地修改数组。
JavaScript 是一门古老的语言,它在保持向上兼容性的同时经历了 6 个版本的演变,最终形成了一系列机制,这些机制很难以严格的、确定性的方式指定。这就是为什么不幸的是,当前浏览器中实现的版本的官方规范 (ECMA 6.0) 完全没有教育意义 material.
我怀疑语言学习者是否会从最初的 overview 阅读它中获益很多,这并没有深入细节。
除非你想专攻 JS 并自己解决规范,否则你将不得不依赖博主的解释,比如 this one or perhaps this one.
question(language used - js) - 当你从二叉树中复制一个节点时,该节点下的整个分支是什么(你知道二叉树节点有属性 left
和 right
,在它们下面,是更多的节点。)也被复制到变量中?好吧... node
是二叉树中的一个对象...并且 objects
是 reference values
,所以我猜测树的相同 node
排在那里, 而不是 copy of that node
.
我正在尝试在二叉树中执行 breadthFirstSearch
,我必须将树的 node
放在 queue
中。我想知道,当我 enqueue
queue
中 binary tree
的 node
时,是那个特定 node
及其 [=26] 的副本=] 或 properties
(正如我们所知)被添加到 queue
或仅添加了对 node
的引用?因为如果那个特定的节点被复制,并且树中有 1000 个节点,那么 node
下面的整个分支也可能被复制(因为我不知道这是否真的发生了)...... .这对性能和内存非常不利。如果它只引用那个节点,那么它完全没问题,因为我没有复制树的整个分支。
JavaScript 通过引用分配 objects 和 arrays,这意味着给定的对象或数组可以分配给任何数字变量而不复制它。 此外,对象和数组是可变的,这意味着您可以在创建后修改它们的内容。
例如:
a = [1,2,3]; // a is a reference to a freshly created array
b = a; // b is a second reference to the same array
a.pop(); // a is used to remove the last element of the underlying array
console.log (b); // b is also affected
输出:
Array [ 1, 2 ] // through `a` we modified the contents of `b`.
正如您所指出的,可变性的主要优点是效率。
另一方面,使用可变对象是棘手的,因为您要负责保证引用的一致性(用外行的话来说,您经常冒着无意中通过某些 'b' 破坏某些内容的风险 'a').
由于 JavaScript 对 variable typing 的概念非常有限,因此没有简单的方法可以判断哪个标识符允许在某个时间点访问和修改给定的数据。
定义相等的概念也很困难:我们是在谈论引用相等(a 和 b 引用相同的底层对象)还是内容相等(a 和 b 引用恰好包含相同数据的两个不同对象)?
这个陷阱是无数令人费解的错误的根源。
更糟糕的是,内置方法提供了多种方法。例如,一些可链式数组方法(filter
、map
、reduce
、find
)return 新数组,其他(pop
/push
, shift
/unshift
, splice
, sort
) 原地修改数组。
JavaScript 是一门古老的语言,它在保持向上兼容性的同时经历了 6 个版本的演变,最终形成了一系列机制,这些机制很难以严格的、确定性的方式指定。这就是为什么不幸的是,当前浏览器中实现的版本的官方规范 (ECMA 6.0) 完全没有教育意义 material.
我怀疑语言学习者是否会从最初的 overview 阅读它中获益很多,这并没有深入细节。
除非你想专攻 JS 并自己解决规范,否则你将不得不依赖博主的解释,比如 this one or perhaps this one.