private static Node BuildTree(XmlTree source) { //Ищем все вершины, у которых нет родителей и имеются дети var detached = source.Nodes.Where(e => { var parents = source.Nodes.Where(q => q.Bonds.Contains(e.Id)); if (parents.Count() == 0) { return(true); } return(false); }).Where(e => e.Bonds.Count() > 0); if (detached.Count() != 1) { throw new Exception("Корень дерева не найден, задано более одного дерева или вершины дерева зациклены"); } //Задаем корень var root = detached.FirstOrDefault(); var node = new Node(root.Id, null); AddChildren(node, source); return(node); }
private static void PrepareToBuild(XmlTree source) { var hash = new HashSet <string>(); var count = source.Nodes.Count(); source.Nodes.ForEach(e => { if (string.IsNullOrWhiteSpace(e.Bond)) { e.Bonds = new List <int>(); return; } e.Bonds = e.Bond.Trim() .Split(' ') .Select(e => { if (hash.Contains(e)) { throw new Exception($"Вершина {e} имеет более, чем одного родителя"); } hash.Add(e); return(Convert.ToInt32(e)); }) .ToList(); }); }
private static List <SimpleNode> BuildSimpleTree(XmlTree source) { //Ищем все вершины, у которых нет родителей и имеются дети var detached = source.Nodes.Where(e => { var parents = source.Nodes.Where(q => q.Bonds.Contains(e.Id)); if (parents.Count() == 0) { return(true); } return(false); }).Where(e => e.Bonds.Count() > 0); if (detached.Count() != 1) { throw new Exception("Корень дерева не найден, задано более одного дерева или вершины дерева зациклены"); } //Задаем корень var root = detached.FirstOrDefault(); var simpleRoot = new SimpleNode(root.Id, null); foreach (var bond in root.Bonds) { simpleRoot.Add(bond); } var simpleTree = new List <SimpleNode>(); simpleTree.Add(simpleRoot); AddSimpleChildren(simpleRoot, simpleTree, source); return(simpleTree); }
/// <summary> /// Рекурсивно заполняем дерево /// </summary> /// <param name="node"></param> /// <param name="source"></param> private static void AddChildren(Node node, XmlTree source) { var bonds = source.Nodes.FirstOrDefault(e => e.Id == node.Id).Bonds; foreach (var id in bonds) { var child = new Node(id, node); AddChildren(child, source); node.Add(child); } }
private static void AddSimpleChildren(SimpleNode sourceNode, List <SimpleNode> simpleTree, XmlTree source) { foreach (var id in sourceNode.Children) { var node = source.Nodes.FirstOrDefault(e => e.Id == id); var simpleNode = new SimpleNode(id, sourceNode.Id); foreach (var bond in node.Bonds) { simpleNode.Add(bond); } simpleTree.Add(simpleNode); AddSimpleChildren(simpleNode, simpleTree, source); } }