通过某个id来查找所有祖先,该id位于递归层次结构的深处

时间:2013-04-02 21:13:47

标签: algorithm

我想得到Id 51的所有祖先: 1,11,22,31,41。

我不想要一个algorythm,我首先找到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;
}

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

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

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

比我更聪明的人。

1 个答案:

答案 0 :(得分:0)

一个可能的聪明的解决方法是一些规则,它告诉你在哪里找到父母的孩子。例如,在binary search trees s中查看父级时,您知道哪个子级将包含该节点。如果没有这样的规则,您将不得不复制有关祖先中子项的信息,这将重新创建已存储在树中的大部分信息。