树结构遍历时更新子节点为何会同步修改Root根节点的内容?
树结构修改时根节点同步更新的原理说明
这个问题和BFS/DFS遍历、树结构本身的特性无关,核心是编程语言的引用类型赋值逻辑导致的,也不存在所谓“程序判断需要同步更新根节点”的特殊机制:
核心逻辑解释
- 你代码中自定义的
Node属于引用类型,所有引用类型的实例只会在堆内存中存储1份,代码中所有持有这个实例的变量,存储的都是指向这块堆内存的地址引用,不是实例本身的拷贝。 - 你将
Root入队、从队列中Dequeue赋值给deque变量、通过deque.Children[childKey]取到子节点,所有这些操作拿到的都只是原节点的内存地址引用,没有生成新的节点副本。 - 你执行
deque.Children[childKey].WordType = updatevalue时,是顺着引用直接修改了堆内存里的原节点实例属性,所以所有指向这个实例的引用(包括从根节点逐层向下的子节点链)访问到的都是修改后的值,你感知到的“根节点同步更新”本质上是访问了同一个内存对象的结果。
你误解的副本场景触发条件
只有满足以下两种情况时,修改才不会影响原根节点的子树:
- 你操作的是值类型(比如int、bool、自定义struct等),值类型赋值时会默认生成副本,修改副本不影响原值
- 你主动调用深拷贝方法、或
new Node()生成了新的节点实例,新实例和原节点完全独立,修改新实例不会影响原节点
代码片段参考
private static void BFS_UpdateAllWords(Node Root, string testword, string updatevalue) { Queue<Node> bfs_queue = new Queue<Node>(); bfs_queue.Enqueue(Root); while (bfs_queue.Count > 0) { var deque = bfs_queue.Dequeue(); foreach (string childKey in deque.Children.Keys) { // Update all child nodes at the key if (deque.Children[childKey].Word.Equals(testword)) { // This part right here for any time of Tree traversal deque.Children[childKey].WordType = updatevalue; } bfs_queue.Enqueue(deque.Children[childKey]); } } }
内容的提问来源于stack exchange,提问作者user14644517
相关产品推荐
相关产品推荐

