Beispiel #1
0
        public void Add(TreeDecision <T> treeToAdd, TreeElement <T> parent)
        {
            if (treeToAdd == null)
            {
                throw new NullReferenceException();
            }

            if (treeToAdd == this)
            {
                throw new ArgumentException();
            }

            if (_elements.Contains(parent) || parent == Root)
            {
                _branchCount += parent.PathCount * treeToAdd._branchCount;

                if (!parent.HasChildren)
                {
                    _branchCount -= parent.PathCount;
                }

                parent.AddChildren(treeToAdd.Root.Children);
                treeToAdd.Root.RemoveAllChildren();
                _elements.UnionWith(treeToAdd._elements);
            }
            else
            {
                throw new Exception($"Нет такого родителя!\n {parent}");
            }
        }
Beispiel #2
0
        public void Add(TreeDecision <T> treeToAdd, IEnumerable <TreeElement <T> > parents)
        {
            if (treeToAdd == null)
            {
                throw new NullReferenceException();
            }

            if (treeToAdd == this)
            {
                throw new ArgumentException();
            }

            if (_elements.IsSupersetOf(parents))
            {
                foreach (var parent in parents)
                {
                    _branchCount += parent.PathCount * treeToAdd._branchCount;

                    if (!parent.HasChildren)
                    {
                        _branchCount -= parent.PathCount;
                    }

                    parent.AddChildren(treeToAdd.Root.Children);
                }

                treeToAdd.Root.RemoveAllChildren();
                _elements.UnionWith(treeToAdd._elements);
            }
            else
            {
                throw new Exception($"Нет таких родителей!\n{parents.ToString()}");
            }
        }
Beispiel #3
0
        /// <summary>
        /// Итерировать в форме змейки без повтором элементов
        /// </summary>
        public static IEnumerable <TreeElement <T> > SnakeIterator <T>(this TreeDecision <T> tree)
        {
            if (tree.Root.HasChildren)
            {
                return(GetElementsSnake(tree.Root.Children));
            }

            throw new Exception("Пустое дерево!");
        }
Beispiel #4
0
        internal static IEnumerable <TreeElement <T> > BranchIteratorWithRoot <T>(this TreeDecision <T> tree)
        {
            yield return(tree.Root);

            if (tree.Root.HasChildren)
            {
                foreach (var element in GetElementsDown(tree.Root))
                {
                    yield return(element);
                }
            }
        }
Beispiel #5
0
 public void AddToLeafs(TreeDecision <T> treeToAdd)
 {
     if (!IsEmpty)
     {
         var leafs = GetLeafs();
         Add(treeToAdd, leafs);
     }
     else
     {
         Add(treeToAdd, Root);
     }
 }
Beispiel #6
0
        /// <summary>
        /// Итерировать каждую ветку с повторами элементов
        /// </summary>
        public static IEnumerable <TreeElement <T> > BranchIteratorWithDuplicates <T>(this TreeDecision <T> tree)
        {
            if (tree.Root.HasChildren)
            {
                return(GetElementsDownWithDuplicates(tree.Root));
            }

            throw new Exception("Пустое дерево!");
        }
Beispiel #7
0
 public void AddToRoot(TreeDecision <T> treeToAdd)
 {
     Add(treeToAdd, Root);
 }