-1

我想得到 ID 51 的所有祖先,它们是:1、11、22、31、41。

我不想要一个算法,我首先找到 ID 为 51 的对象,然后向上遍历父层次结构。

我想递归地向下层级并抓住所有祖先。

但我猜这样玩游戏不好吗?因为每次我能抓住一个祖先,我都不知道下一个孩子是否是 ID 52。有什么聪明的解决方法吗?

 1
-11
 -21
 -22
  -31
   -41
    -51
  -32
  -33
 -23
-12
-13

更新

@Jim Mischel 询问我如何找到该对象并显示该代码:

public static T FindChild<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> selectorChildrenProperty, Predicate<T> condition) where T : class {

    if(source == default(T)) {
        throw new ArgumentNullException("source"); 
    }

    T t = default(T);
    foreach(T item in source) {
        if(condition(item)) {
            t = item;
            break;
        }
        else {
            t = selectorChildrenProperty(item).FindInHierarchy<T>(selectorChildrenProperty, condition);
            if(!Equals(t, default(T))) {
                break;
            }
        }
    }
    return t;
}

这将找到具有特定属性的对象并将其返回。

当然,我可以编写第二个通用方法并从找到的对象开始并遍历层次结构,直到父对象为空,但是......

也许有一个聪明的算法我敢问......

比我聪明的人。

4

1 回答 1

0

一种可能的巧妙解决方法是一些规则,它告诉您在哪里可以找到父母的孩子。例如,在二叉搜索树中,当您查看父节点时,您知道哪个子节点将包含该节点。如果没有这样的规则,您将不得不在祖先中复制有关孩子的信息,这将重新创建已存储在树中的大部分信息。

于 2013-04-03T06:49:57.040 回答