微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于从二叉树复制/获取节点的问题

如何解决关于从二叉树复制/获取节点的问题

问题(使用的语言 - js)-当您从二叉树复制节点时,该节点下方的整个分支(您知道二叉树节点具有属性 leftright,在它们下方,是否有更多节点。)也被复制到变量中?嗯... node 是二叉树中的一个对象...而 objectsreference values,所以我猜测树的相同 node 排在那里,而不是 copy of that node

我正在尝试在二叉树中执行 breadthFirstSearch,我必须将树的 node 放在 queue 中。我想知道,当我在 enqueuenodebinary treequeue 是该特定 node 的副本及其 {{1 }} 或 keys(如我们所知)被添加properties 或只添加queue 的引用?因为如果该特定节点被复制,并且树中有 1000 个节点,那么 node 下面的整个分支也可能被复制(因为我不知道这是否真的发生了)... .这对性能和内存非常不利。如果它只引用到那个节点,那么完全没问题,因为我没有复制树的整个分支。

解决方法

JavaScript 通过引用分配对象数组,这意味着可以将给定的对象或数组分配给任意数量的变量而无需复制它。 此外,对象和数组是可变的,这意味着您可以在创建后修改它们的内容。

例如:

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`.

正如您所指出的,可变性的主要优点是效率。 另一方面,使用可变对象很棘手,因为您需要负责保证引用的一致性(用外行的话来说,您经常面临无意中通过某些 'a' 破坏某些 'b' 的内容的风险).
由于 JavaScript 对 variable typing 的概念非常有限,因此没有简单的方法来判断哪些标识符允许在某个时候访问和修改给定的数据。
定义相等的概念也很困难:我们是在谈论引用的相等(a 和 b 引用相同的底层对象)还是内容的相等(a 和 b 引用碰巧拥有相同数据的两个不同对象)?
这个陷阱是无数令人费解的错误的根源。
更糟糕的是,内置方法提供了多种方法。例如,一些可链接的数组方法(filtermapreducefind)返回新数组,其他方法(pop/pushshift/unshift,splice,sort) 修改数组。

JavaScript 是一门古老的语言,它在保持向上兼容性的同时经过 6 个版本的演变,最终形成了一系列很难以严格、确定性方式指定的机制。不幸的是,这就是为什么当前浏览器 (ECMA 6.0) 中实现的版本的官方规范不是教育材料。
我怀疑语言学习者是否会从最初的 overview 之外的阅读中获益,因为它没有详细说明。
除非您想专攻 JS 并自己处理规范,否则您将不得不依赖博主的介绍,例如 this onethis one

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。