0

我有这样定义的树节点:

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

我把它称为主节点。它看起来不错,它正在遍历树,但节点没有被重写。我尝试了 treenode 的参数,但我遇到了 foreach 循环的问题。我该如何修复它以使其正常工作?谢谢

4

1 回答 1

1

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

var redux = TreeReduction(rootNode, 0);

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

我省略了 Parent 属性,因为它的 setter 是私有的。如果 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;
    }
于 2013-01-30T10:29:31.127 回答