C# 从父子节点集合中查找死节点

C# 从父子节点集合中查找死节点,c#,algorithm,linq,C#,Algorithm,Linq,我有一个具有父子关系的自定义节点集合。每个节点可以是复合类型(其中包含其他子节点)或简单类型(叶级节点) 我想写一个函数,它会给我所有死节点的列表。 例如,这里是节点集合 基于上述情况,p2、p3、p8、p9、p10、p6、c1是死节点(因为在它们的层次结构中没有任何简单节点) 我需要一个函数作为 private List<NodeEntity> GetDeadNodes(List<NodeEntity> originalList) 私有列表GetDeadNodes

我有一个具有父子关系的自定义节点集合。每个节点可以是复合类型(其中包含其他子节点)或简单类型(叶级节点)

我想写一个函数,它会给我所有死节点的列表。 例如,这里是节点集合

基于上述情况,p2、p3、p8、p9、p10、p6、c1是死节点(因为在它们的层次结构中没有任何简单节点)

我需要一个函数作为

private List<NodeEntity> GetDeadNodes(List<NodeEntity> originalList) 
私有列表GetDeadNodes(列表原始列表)
下面是具有原始列表的函数

private List<NodeEntity> GetOriginalList()
{
    var list = new List<NodeEntity>()
    {
        new NodeEntity() {Code = "P1", ParentCode = "001", Type = NodeType.Composite},
        new NodeEntity() {Code = "C1", ParentCode = "001", Type = NodeType.Composite},
        new NodeEntity() {Code = "P2", ParentCode = "P1", Type = NodeType.Composite},
        new NodeEntity() {Code = "P3", ParentCode = "P2", Type = NodeType.Composite},
        new NodeEntity() {Code = "P8", ParentCode = "P3", Type = NodeType.Composite},
        new NodeEntity() {Code = "P9", ParentCode = "P3", Type = NodeType.Composite},
        new NodeEntity() {Code = "P4", ParentCode = "P1", Type = NodeType.Composite},
        new NodeEntity() {Code = "L3", ParentCode = "P1",  Type = NodeType.Simple},
        new NodeEntity() {Code = "P6", ParentCode = "P1",  Type = NodeType.Composite},
        new NodeEntity() {Code = "P10", ParentCode = "P4",  Type = NodeType.Composite},
        new NodeEntity() {Code = "L2", ParentCode = "P4",  Type = NodeType.Simple},
        new NodeEntity() {Code = "P5", ParentCode = "P4",  Type = NodeType.Composite},
        new NodeEntity() {Code = "L1", ParentCode = "P5",  Type = NodeType.Simple}
    };
    return list;
}
private List GetOriginalList()
{
var list=新列表()
{
new NodeEntity(){Code=“P1”,ParentCode=“001”,Type=NodeType.Composite},
new NodeEntity(){Code=“C1”,ParentCode=“001”,Type=NodeType.Composite},
new NodeEntity(){Code=“P2”,ParentCode=“P1”,Type=NodeType.Composite},
new NodeEntity(){Code=“P3”,ParentCode=“P2”,Type=NodeType.Composite},
new NodeEntity(){Code=“P8”,ParentCode=“P3”,Type=NodeType.Composite},
new NodeEntity(){Code=“P9”,ParentCode=“P3”,Type=NodeType.Composite},
new NodeEntity(){Code=“P4”,ParentCode=“P1”,Type=NodeType.Composite},
new NodeEntity(){Code=“L3”,ParentCode=“P1”,Type=NodeType.Simple},
new NodeEntity(){Code=“P6”,ParentCode=“P1”,Type=NodeType.Composite},
new NodeEntity(){Code=“P10”,ParentCode=“P4”,Type=NodeType.Composite},
new NodeEntity(){Code=“L2”,ParentCode=“P4”,Type=NodeType.Simple},
new NodeEntity(){Code=“P5”,ParentCode=“P4”,Type=NodeType.Composite},
new NodeEntity(){Code=“L1”,ParentCode=“P5”,Type=NodeType.Simple}
};
退货清单;
}

您可以从每个简单节点执行简单的树扫描,以收集要保留的所有节点(以伪代码形式):


你可以试试那样的

    private List<NodeEntity> GetDeadNodes(List<NodeEntity> originalList)
    {
        var rest = originalList.ToList();

        // Remove simple nodes and their ascendants.
        // The rest will be dead nodes.
        var simpleNodes = originalList.Where(n => n.Type == NodeType.Simple);
        foreach (var simpleNode in simpleNodes)
        {
            rest.Remove(simpleNode);
            RemoveAscendants(rest, simpleNode);
        }

        return rest;
    }

    private void RemoveAscendants(List<NodeEntity> rest, NodeEntity node)
    {
        var parent = rest.SingleOrDefault(n => n.Code == node.ParentCode);

        // We have reached the root node.
        if (parent == null)
        {
            return;
        }
        rest.Remove(parent);
        RemoveAscendants(rest, parent);
    }
私有列表GetDeadNodes(列表原始列表)
{
var rest=originalList.ToList();
//移除简单节点及其上升点。
//其余的将是死节点。
var simpleNodes=originalList.Where(n=>n.Type==NodeType.Simple);
foreach(simpleNode中的var simpleNode)
{
其余。移除(simpleNode);
去除杂质(剩余、简单化);
}
返回休息;
}
私有void removescendants(列出其余节点、节点实体节点)
{
var parent=rest.SingleOrDefault(n=>n.Code==node.ParentCode);
//我们已到达根节点。
如果(父项==null)
{
返回;
}
休息。移除(父母);
移除诱因(休息、父母);
}

p1、p4、p6、L3、c1是否处于同一级别?您尝试了什么?树加递归深度优先搜索?从简单节点开始访问的节点队列?有什么事吗?看我的图片附件。p6、p4、L3是p1的子级。c1和p1与001…和p2的子级处于同一级别?p2是p1(i)的孩子,为什么对简单的
循环使用递归<代码>while节点!=null{remove node;node=find parent node;}
(ii)注释应为“我们已到达根节点或父节点已被删除”
    private List<NodeEntity> GetDeadNodes(List<NodeEntity> originalList)
    {
        var rest = originalList.ToList();

        // Remove simple nodes and their ascendants.
        // The rest will be dead nodes.
        var simpleNodes = originalList.Where(n => n.Type == NodeType.Simple);
        foreach (var simpleNode in simpleNodes)
        {
            rest.Remove(simpleNode);
            RemoveAscendants(rest, simpleNode);
        }

        return rest;
    }

    private void RemoveAscendants(List<NodeEntity> rest, NodeEntity node)
    {
        var parent = rest.SingleOrDefault(n => n.Code == node.ParentCode);

        // We have reached the root node.
        if (parent == null)
        {
            return;
        }
        rest.Remove(parent);
        RemoveAscendants(rest, parent);
    }