递归确定子结构

本文关键字:结构 递归 | 更新日期: 2023-09-27 18:33:19

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

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

现在我正在尝试使用递归方法将每个分支中的最大 Children 提升到上层。为了澄清这一点,假设我有以下结构:

- 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;
        }

有人可以在到达那里的路上帮助我吗?

递归确定子结构

我把它分成了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);
}

使用 @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);
        }
    }
}