0

我有一个内存树结构,类似于目录树。即:每个节点都有一个命名子节点的字典。我想要一种从名称列表或数组中遍历树的有效方法。

如果我从根节点开始,有一个我想要遍历的子节点列表,{"organisms","primates","human","male","John Smith"} 然后我递归处理一个步骤并传递剩余的子列表到子节点,返回 this.subNodes[myList[0]].GetSubNode(myList.GetRange(1,myList.Count-1)) ... 即使 List.GetRange() 是浅拷贝,它仍然是将为每个级别的递归创建一个新列表。整个操作看起来非常的时间和空间效率低下。

或者,如果我尝试使用数组,那么我能找到的创建子数组的最佳方法是 Array.Copy,这也是浅拷贝。同样的问题。

我在考虑 C 语言,其中列表的头部只是一个指向一个对象的指针,该对象具有另一个指向另一个对象的指针,因此获取子列表就像跟随一个指针一样简单。或者数组只是指向某个内存的指针,因此获取子数组就像增加指针一样简单。非常节省时间和空间。有没有办法在 C# 中做到这一点?

目前,在 C# 中,我想我只需要忘记递归并从顶层进行某种迭代......

或者我可以递归地传递未修改的数组作为参数,以及一个 int 索引,我将在每个级别更深地递增。这很好,除了我需要将另一个参数传递给递归方法调用,其唯一目的是与第 n 个递归方法调用进行通信,“忽略数组中的前 n 个项目”......这很好,如果这是唯一可能的解决方案(或最好的解决方案),这似乎很愚蠢。

有没有更好的办法?

4

1 回答 1

1

.net 中有一个LinkedList 实现,它允许您将下一个 LinkedListNode 传递给方法。

除此之外,使用索引的方法也很好——至少它不会消耗额外的内存。

还有一种方法可以将指针传递给数组元素,就像在 C 中一样。但这会迫使您在不安全模式下编译程序,这通常是不可取的。

于 2013-04-10T22:03:29.260 回答