JavaScript数组转二叉树时为什么root变量能保存while循环构建的完整树?
问题解答
1. 为什么root变量最终可以完整保留while循环内构建的整棵树的结果?
这是JavaScript引用类型的特性决定的:TreeNode创建的都是堆内存中的对象,root变量存储的是根节点对象的内存地址引用,而非对象本身的完整拷贝。
整段代码运行过程中,root的指向从未被修改,所有树结构的构建操作本质都是给各个节点对象的left、right属性挂载其他节点的引用,这些引用关系最终都会通过根节点的子节点属性层层关联。只要根节点的引用不变,就能从它出发遍历到所有关联的子节点,自然可以保留完整的树结构。
2. while循环第一次迭代时curr变量引用root,从第二次迭代开始curr每次都指向新创建的节点,为何不会影响root保存完整树结构?
curr只是用来操作节点的临时变量,本身不存储树结构数据,它的指向变更不会影响已经构建好的节点关联关系:
- 第一次迭代时
curr指向根节点,此时修改curr.left/curr.right本质就是修改根节点的对应属性,会直接把第一层子节点挂到根节点上 - 后续迭代中
curr只是从队列中取出其他父节点的引用,此时修改curr的子节点属性,是修改它当前指向的那个父节点的属性,和根节点没有冲突 - 队列中存储的所有节点都是已经和根节点建立了关联关系的节点,给它们挂子节点只会扩展树的层级,不会破坏已有的根节点关联
你可以理解为curr只是个临时操作手柄:你用它操作完根节点之后,再把它接到其他节点上做操作,不会改变之前已经在根节点上做好的配置。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

