【问题标题】:Find dead nodes from Parent Child Node collection从父子节点集合中查找死节点
【发布时间】:2017-08-21 15:55:21
【问题描述】:

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

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

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

我需要一个函数

private List<NodeEntity> GetDeadNodes(List<NodeEntity> originalList) 

这里是具有原始列表的函数

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

【问题讨论】:

  • p1、p4、p6、L3、c1是同级的吗?
  • 你试过什么?树加递归深度优先搜索?从简单节点开始访问的节点队列?有什么事吗?
  • 查看我的图片附件。 p6、p4、L3 是 p1 的孩子。 c1 和 p1 处于同一级别,是 001 的子级
  • ...和 ​​p2?他们的位置有点让我失望。
  • p2 是 p1 的子节点

标签: c# algorithm linq


【解决方案1】:

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

put Simple nodes in a Set

while node in Set
  add node to a 'seen' list
  add parent to Set

dead nodes = all nodes except 'seen' nodes

【讨论】:

    【解决方案2】:

    你可以试试这样的。

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

    【讨论】:

    • (i) 为什么对简单的while 循环使用递归? while node != null { remove node; node = find parent node;} (ii) 注释应该是“我们已经到达根节点或者父节点已经被移除”
    猜你喜欢
    • 2021-07-16
    • 2016-03-11
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多