示例#1
0
        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);
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
            }
        }
示例#4
0
        /// <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);
        }