来自关键字的 C# 树减少了长分支

本文关键字:分支 关键字 | 更新日期: 2023-09-27 17:56:33

>我有这样定义的树节点:

class TreeNode : IEnumerable<TreeNode>
{
    private readonly Dictionary<string, TreeNode> _childs = new Dictionary<string, TreeNode>();
    public readonly string ID;
    public TreeNode Parent { get; private set; }
    public int Level { get; set; }
    public TreeNode(string id)
    {
        this.ID = id;
    }
    // some other methods
}

通过这个从关键字创建了树,现在我有时会有分支,其中父树节点有一个孩子,那个孩子也可以有一个孩子,在某些节点之后有 2 个孩子。所以我现在想将所有子节点(删除它)减少到至少有 2 个子节点的"水平"。

我尝试了这样的事情:

private void TreeReduction(TreeNode node)
    {
        while (node.Count() == 1)
        {
            node = node.GetFirstChild();
        }
        foreach (var child in node)
        {
            TreeReduction(child);
        }
    }

我将其称为主节点。它看起来不错,它正在通过树,但节点没有重写。我尝试了树节点的参数,但我对 foreach 循环有问题。我怎样才能修复它才能让它工作?谢谢

来自关键字的 C# 树减少了长分支

对会发生什么做出许多假设,例如单枝单叶树,你可以选择这样的事情。

var redux = TreeReduction(rootNode, 0);

除此之外,关键点是你的递归方法返回一个 TreeNode,你可以将其设置为子节点。

我省略了父属性,因为它的设置器是私有的。如果 AddChild 未设置它,则应将其公开并将其作为参数携带。

private TreeNode TreeReduction(TreeNode node, int currentLevel)
    {
        if(node==null)
          return null;
        if(node.Count() == 1)
        {
            var redux = TreeReduction(node.GetFirstChild(), currentLevel);
            return redux?? new TreeNode(node.ID{level=currentLevel});
        }
        var newNode = new TreeNode(node.ID{level=currentLevel});
        foreach (var child in node)
        {
            var newChild = TreeReduction(child, currentLevel+1);
            if(newChild!=null)
               newNode.AddChild(newChild);
        }
        return newNode;
    }