private static void NextLeaf(List <SimpleNode> source, ref List <SimpleNode> reverse, SimpleNode parent, int?current) { var currentNode = source.FirstOrDefault(e => e.Id == current); var oldParent = currentNode.Parent; var node = new SimpleNode(Convert.ToInt32(current), parent.Id); var bonds = currentNode.Children.Where(e => e != parent.Id); foreach (var bond in bonds) { node.Add(bond); var child = source.FirstOrDefault(e => e.Id == bond); } reverse.Add(node); if (oldParent != null) { node.Add(oldParent); NextLeaf(source, ref reverse, node, oldParent); } else { FillOriginal(source, ref reverse); } }
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); }
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); } }
/// <summary> /// Получить список новых деревьев с корнями в листьях /// </summary> /// <param name="list"></param> /// <param name="leafs"></param> /// <returns></returns> public static List <List <SimpleNode> > GetReverse(this List <SimpleNode> list, List <SimpleNode> leafs) { var source = new List <SimpleNode>(list); var reversed = new List <List <SimpleNode> >(); foreach (var leaf in leafs) { var reverse = new List <SimpleNode>(); var root = new SimpleNode(leaf.Id, null); root.Add(leaf.Parent); reverse.Add(root); NextLeaf(source, ref reverse, root, leaf.Parent); reversed.Add(reverse); } return(reversed); }