【问题标题】:problem regarding copying/taking a node from the binary tree关于从二叉树复制/获取节点的问题
【发布时间】:2021-09-30 01:37:26
【问题描述】:

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

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

【问题讨论】:

    标签: javascript queue binary-tree javascript-objects


    【解决方案1】:

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

    例如:

    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/unshiftsplicesort) 就地修改数组。

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

    【讨论】:

    • 你的回答是对的,我已经怀疑并且知道肯定是这样,只是想确认一下。每一个不是原始的东西,基本上都是 js 中的一个参考值。
    猜你喜欢
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多