c# - 查找不是父/祖 parent /等或子/孙/等的所有链接对象的算法

标签 c# algorithm recursion

我有一个名为 Device 的对象。 Device 可以有一个父 Device。一个 Device 也可以有 n 个子 Devices

我有一个下拉列表,其中显示了所有可选择的设备。我可以很容易地获取数据库中的所有 Devices - db.Devices

层次结构可以无限深。

我需要获取所有不在树中给定Device之上或之下的Devices。本质上,我要求的是与给定的 Device 无关的 Devices(既不是 parent /祖 parent /曾祖 parent /等,也不是 child /孙/曾孙/等)。我还需要从列表中排除给定的 Device

最好的方法是什么?我应该使用递归吗?

(我将 C# 和 Entity Framework 与 SQL Server 数据库结合使用,因此我可以使用 Linq To SQL 或使用模型本身。)

最佳答案

我的方法是首先获取设备 D 的所有兄弟:

P = parent of the device
sibs = {all children of P that are not D}

任何 d in sibs 的任何后代都与 D 无关。继续往上看:

G = grandparent of the device
sibs = sibs union {all children of G that are not P}

继续这种方式,集合 sibs 及其所有后代就是您所追求的集合。

在伪代码中:

D = device;
siblings = {};
while (D has parent) {
    P = parent(D);
    siblings = siblings union (children(P) \ D);
    D = P;
}
return descendants(siblings);

关于c# - 查找不是父/祖 parent /等或子/孙/等的所有链接对象的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7357232/

相关文章:

python - 无法理解 Python 2.7 中阶乘的经典递归示例

c# - 如果我在源代码上插入注释,它的二进制文件 MD5 会被更改吗?

c# - 通过事件处理程序发送参数?

python - N == N 的数字和的某次幂(运行太慢)

algorithm - 修订控制系统如何恢复修订?

javascript - 递归 ajax() 请求

php - 用动态规划解决多项选择背包 (MCKP)?

c# - 如何限制泛型函数只接受某种类型的类

c# - 我的程序太长了。我想用循环方法缩短它

javascript - 以下算法的 3Sum 问题的时空复杂度是多少?