递归地确定子结构

时间:2016-02-05 12:32:55

标签: c# recursion tree

我创建了以下类(简体):

public class ClassItem{
        //Sub-Groups
        public List<ClassItem> Children { get; set; }
        public Int64 MaxChilds { get; set; }
        //Properties
        .........
}

现在我尝试使用递归方法将每个分支中的最大子项放到上一级。为了澄清这一点,请说我有以下结构:

- ClassItem 1                        (5)
    - ClassItem 1.1                  (1)
        - ClassItem 1.1.1            (0)
    - ClassItem 1.2                  (0)
    - ClassItem 1.3                  (3)
        - ClassItem 1.3.1            (0)
        - ClassItem 1.3.2            (0)
        - ClassItem 1.3.3            (2)
            - ClassItem 1.3.3.1      (0)
            - ClassItem 1.3.3.2      (0)
    - ClassItem 1.4                  (5)
        - ClassItem 1.4.1            (0)
        - ClassItem 1.4.2            (0)
        - ClassItem 1.4.3            (0)
        - ClassItem 1.4.4            (0)
        - ClassItem 1.4.5            (0)

括号内的数字是最大值;儿童的数量或其子女在其任何一个分支中的子女数量。

我尝试了很多东西,但它似乎没有正常运行。我现在拥有以下内容:

private void FindMaxChilds(ClassItem classItem, ref Int64 horizontalMaxLevels) {
            //Count horizontal for each child
            if (horizontalMaxLevels < classItem.Children.Count) {
                horizontalMaxLevels = classItem.Children.Count;
            }

            foreach (ClassItem cci in classItem.Children) {
                FindMaxLevels(cci, ref horizontalMaxLevels);
            }

            classItem.MaxChilds = horizontalMaxLevels;
        }

有人可以帮助我前往那里吗?

2 个答案:

答案 0 :(得分:3)

我把它分成了DirectChildren,以及我孩子的输出。

public static int MaxDirectChidrenPerItem(ClassItem item)
{
    if (item.Children == null || item.Children.Count == 0)
    {
        return 0;
    }

    int directChildrenCount = item.Children.Count();
    int descendantMaxCount = item.Children.Max(child => MaxDirectChidrenPerItem(child));
    return Math.Max(directChildrenCount, descendantMaxCount);
}

答案 1 :(得分:2)

使用@ OrelEraki的答案,我认为你不需要一个方法,但你可以将所有东西都包装在一个属性中:

public class ClassItem
{
    public List<ClassItem> Children { get; set; }
    public Int64 MaxChildren
    { 
        get
        {
            if (this.Children == null || this.Children.Count == 0)
            {
                return 0;
            }

            int directChildrenCount = this.Children.Count();
            int descendantMaxCount = this.Children.Max(child => child.MaxChildren);
            return Math.Max(directChildrenCount, descendantMaxCount);
        }
    }
}