来自关键字的 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 循环有问题。我怎样才能修复它才能让它工作?谢谢
对会发生什么做出许多假设,例如单枝单叶树,你可以选择这样的事情。
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;
}