gpt4 book ai didi

c# - 如何递归遍历遍历过程中发生变化的树?

转载 作者:行者123 更新时间:2023-11-30 12:25:10 31 4
gpt4 key购买 nike

我正在尝试遍历 DOM 树,使用 AngleSharp HTML 解析器替换和删除节点。这个问题不是这个库独有的,而是一个关于如何递归地改变树并确保我仍然遍历整棵树的一般问题。

以这个列表 myCollection 为例,其中每个条目都是一个节点对象,可能带有子对象。这也是一个现场收藏:

-A
-B
-C
--D
--E
--F
-G

我开始循环递归函数:

private void LoopRecursively(Node element) {
//either do nothing, remove, or replace with children
//e.g. element.Replace(element.ChildNodes);
for (var x = 0; x < element.ChildNodes.Length; x++) {
LoopRecursively(element.ChildNodes[x]);

}
}

假设我们决定用它的子节点替换 C 节点,因此列表变为:

-A
-B
-D
-E
-F
-G

问题是递归会出错。现在有比 for 循环中的 Length 多的节点,因此并非所有项目都将被递归。同样,删除节点意味着跳过列表中向上移动的节点。

我如何递归可能因递归处理而发生变化的树?是否一遍又一遍地递归我的列表,直到我确定没有任何更改是唯一的方法,或者我是否错误地解决了问题?

最佳答案

安全的方法:使用递归函数创建一棵全新的树而不是改变旧树,然后用新树替换旧树。

不太安全的方法:让您的 LoopRecursively 函数返回一个整数,表示添加或删除的节点数,然后用这个新数字更新循环变量。 (更新循环索引和循环条件中的变量)

关于c# - 如何递归遍历遍历过程中发生变化的树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31996123/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com