コード例 #1
0
        public List <SimpleTreeNode <T> > FindNodesByValue(T val)
        {
            // ваш код поиска узлов по значению
            List <SimpleTreeNode <T> >  returnList = new List <SimpleTreeNode <T> >();
            Stack <SimpleTreeNode <T> > stack      = new Stack <SimpleTreeNode <T> >();
            SimpleTreeNode <T>          Node       = Root;

            stack.Push(Root);
            while (stack.Count > 0)
            {
                if (Node.Children != null)
                {
                    foreach (SimpleTreeNode <T> node in Node.Children)
                    {
                        stack.Push(node);
                    }
                }

                Node = stack.Pop();
                if (Comparer <T> .Default.Compare(Node.NodeValue, val) == 0)
                {
                    returnList.Add(Node);
                }
            }
            return(returnList);
        }
コード例 #2
0
        public void MoveNode(SimpleTreeNode <T> OriginalNode, SimpleTreeNode <T> NewParent)
        {
            // ваш код перемещения узла вместе с его поддеревом --
            // в качестве дочернего для узла NewParent

            if (Root != null)
            {
                SimpleTreeNode <T>         OldParent;
                List <SimpleTreeNode <T> > AllNodes = GetAllNodes();
                foreach (SimpleTreeNode <T> node in AllNodes)
                {
                    if (node == OriginalNode)
                    {
                        OldParent   = node.Parent;
                        node.Parent = NewParent;
                        AddChild(NewParent, node);
                        OldParent.Children.Remove(node);
                        if (OldParent.Children.Count == 0)
                        {
                            OldParent.Children = null;
                        }
                        return;
                    }
                }
            }
        }
コード例 #3
0
        private List <SimpleTreeNode <T> > Recursive(SimpleTreeNode <T> targetNode, T val = default(T), bool isFind = false)
        {
            SimpleTreeNode <T> node = targetNode;
            var result = new List <SimpleTreeNode <T> > {
                node
            };

            if (isFind)
            {
                result = new List <SimpleTreeNode <T> >();
                if (node.NodeValue.Equals(val))
                {
                    result.Add(node);
                }
            }

            for (int i = 0; node.Children != null && i < node.Children.Count; i++)
            {
                if (isFind)
                {
                    result.AddRange(Recursive(node.Children[i], val, true));
                }
                else
                {
                    result.AddRange(Recursive(node.Children[i]));
                }
            }

            return(result);
        }
コード例 #4
0
        private static void CalcLevel(SimpleTreeNode <T> node)
        {
            var count = 0;

            CalcLevel(node, ref count);
            node.Level = count;
        }
コード例 #5
0
        public int LeafCount()
        {
            // количество листьев в дереве
            int count = 0;
            Stack <SimpleTreeNode <T> > stack = new Stack <SimpleTreeNode <T> >();
            SimpleTreeNode <T>          Node  = Root;

            stack.Push(Root);
            while (stack.Count > 0)
            {
                if (Node.Children != null)
                {
                    foreach (SimpleTreeNode <T> node in Node.Children)
                    {
                        stack.Push(node);
                    }
                }
                else
                {
                    count++;
                }
                Node = stack.Pop();
            }
            return(count);
        }
コード例 #6
0
        public void TestInitialize()
        {
            Node0 = new SimpleTreeNode <int>(777, null);
            Tree  = new SimpleTree <int>(Node0);

            Node1  = new SimpleTreeNode <int>(10, null);
            Node2  = new SimpleTreeNode <int>(20, null);
            Node3  = new SimpleTreeNode <int>(30, null);
            Node4  = new SimpleTreeNode <int>(40, null);
            Node5  = new SimpleTreeNode <int>(50, null);
            Node6  = new SimpleTreeNode <int>(60, null);
            Node7  = new SimpleTreeNode <int>(70, null);
            Node8  = new SimpleTreeNode <int>(80, null);
            Node9  = new SimpleTreeNode <int>(90, null);
            Node10 = new SimpleTreeNode <int>(60, null);

            Tree.AddChild(Node0, Node1);
            Tree.AddChild(Node1, Node2);
            Tree.AddChild(Node1, Node7);
            Tree.AddChild(Node2, Node3);
            Tree.AddChild(Node2, Node5);
            Tree.AddChild(Node1, Node4);
            Tree.AddChild(Node3, Node8);
            Tree.AddChild(Node3, Node9);
            Tree.AddChild(Node9, Node10);
            Tree.AddChild(Node9, Node6);
        }
コード例 #7
0
 // Удаляет ребро связывающее текущий узел(вершину) со своим родителем.
 //
 private void DeleteEdge(SimpleTreeNode <T> node)
 {
     if (node.Parent != null)
     {
         node.Parent.Children.Remove(node);
         node.Parent = null;
     }
 }
コード例 #8
0
 private static void CalcLevel(SimpleTreeNode <T> node, ref int count)
 {
     count += 1;
     if (node.Parent == null)
     {
         return;
     }
     CalcLevel(node.Parent, ref count);
 }
コード例 #9
0
 public void AddChild(SimpleTreeNode <T> ParentNode, SimpleTreeNode <T> NewChild)
 {
     // ваш код добавления нового дочернего узла существующему ParentNode
     NewChild.Parent = ParentNode;
     if (ParentNode.Children == null)
     {
         ParentNode.Children = new List <SimpleTreeNode <T> >();
     }
     ParentNode.Children.Add(NewChild);
 }
コード例 #10
0
 public void MoveNode(SimpleTreeNode <T> OriginalNode, SimpleTreeNode <T> NewParent)
 {
     // ваш код перемещения узла вместе с его поддеревом --
     // в качестве дочернего для узла NewParent
     if (OriginalNode != NewParent)
     {
         SimpleTreeNode <T> node = OriginalNode;
         OriginalNode.Parent.Children.Remove(OriginalNode);
         AddChild(NewParent, node);
     }
 }
コード例 #11
0
 private void WriteNextLayer(SimpleTreeNode <T> node)
 {
     if (node.Children != null)
     {
         foreach (SimpleTreeNode <T> child in node.Children)
         {
             child.layer = node.layer + 1;
             WriteNextLayer(child);
         }
     }
 }
コード例 #12
0
 private void SetNextLevel(SimpleTreeNode <T> node)
 {
     if (node.Children != null)
     {
         foreach (SimpleTreeNode <T> child in node.Children)
         {
             child.level = node.level + 1;
             SetNextLevel(child);
         }
     }
 }
コード例 #13
0
 private static void LeafResult(SimpleTreeNode <T> node, ref int counter)
 {
     if (node.Children == null)
     {
         counter += 1;
         return;
     }
     foreach (var nodeChild in node.Children)
     {
         LeafResult(nodeChild, ref counter);
     }
 }
コード例 #14
0
 private static void EnumerateAndCalcTree(SimpleTreeNode <T> node)
 {
     CalcLevel(node);
     if (node.Children == null)
     {
         return;
     }
     foreach (var nodeChild in node.Children)
     {
         EnumerateAndCalcTree(nodeChild);
     }
 }
コード例 #15
0
 private static void FillResult(SimpleTreeNode <T> node, List <SimpleTreeNode <T> > result)
 {
     result.Add(node);
     if (node.Children == null)
     {
         return;
     }
     foreach (var nodeChild in node.Children)
     {
         FillResult(nodeChild, result);
     }
 }
コード例 #16
0
        public List <SimpleTreeNode <T> > GetChildren(SimpleTreeNode <T> Node)
        {
            List <SimpleTreeNode <T> > Children = new List <SimpleTreeNode <T> >();

            if (Node.Children != null)
            {
                foreach (SimpleTreeNode <T> node in Node.Children)
                {
                    Children.Add(node);
                    Children.AddRange(GetChildren(node));
                }
            }
            return(Children);
        }
コード例 #17
0
 private void FindResult(SimpleTreeNode <T> node, List <SimpleTreeNode <T> > result, T val)
 {
     if (val.Equals(node.NodeValue))
     {
         result.Add(node);
     }
     if (node.Children == null)
     {
         return;
     }
     foreach (var nodeChild in node.Children)
     {
         FindResult(nodeChild, result, val);
     }
 }
コード例 #18
0
 public void DeleteNode(SimpleTreeNode <T> NodeToDelete)  //  код удаления существующего узла NodeToDelete
 {
     if (NodeToDelete.Parent == null)
     {
         Root = null;
     }
     else if (NodeToDelete.Parent.Children.Count == 1)
     {
         NodeToDelete.Parent.Children = null;
     }
     else
     {
         NodeToDelete.Parent.Children.Remove(NodeToDelete);
     }
 }
コード例 #19
0
 public void DeleteNode(SimpleTreeNode <T> NodeToDelete)
 {
     if (NodeToDelete.Parent == null)
     {
         Root = null;
     }
     else if (NodeToDelete.Parent.Children.Count == 1)
     {
         NodeToDelete.Parent.Children = null;
     }
     else
     {
         NodeToDelete.Parent.Children.Remove(NodeToDelete);
     }
 }
コード例 #20
0
        public void MoveNode(SimpleTreeNode <T> OriginalNode, SimpleTreeNode <T> NewParent)
        {
            // ваш код перемещения узла вместе с его поддеревом --
            // в качестве дочернего для узла NewParent
            if (NewParent.Children == null)
            {
                NewParent.Children = new List <SimpleTreeNode <T> >();
            }
            NewParent.Children.Add(OriginalNode);
            if (OriginalNode.Parent != null)
            {
                OriginalNode.Parent.Children.Remove(OriginalNode);
            }

            OriginalNode.Parent = NewParent;
        }
コード例 #21
0
 private List <SimpleTreeNode <T> > AllNodes(List <SimpleTreeNode <T> > list, SimpleTreeNode <T> node)
 {
     list.Add(node);
     if (node.Children != null)
     {
         foreach (SimpleTreeNode <T> child in node.Children)
         {
             list = AllNodes(list, child);
         }
     }
     if (list.Count > 0)
     {
         return(list);
     }
     return(null);
 }
コード例 #22
0
        public void MoveNode(SimpleTreeNode <T> OriginalNode, SimpleTreeNode <T> NewParent)
        {
            List <SimpleTreeNode <T> > targetList    = FindNodesByValue(OriginalNode.NodeValue);
            List <SimpleTreeNode <T> > newParentList = FindNodesByValue(NewParent.NodeValue);

            if (targetList != null && newParentList != null)
            {
                var targetNode    = targetList.Find(delegate(SimpleTreeNode <T> node) { return(node == OriginalNode); });
                var newParentNode = newParentList.Find(delegate(SimpleTreeNode <T> node) { return(node == NewParent); });

                if (targetNode != null && targetNode != Root && newParentNode != null)
                {
                    OriginalNode.Parent.Children.Remove(OriginalNode);
                    OriginalNode.Parent = NewParent;
                    AddChild(NewParent, OriginalNode);
                }
            }
        }
コード例 #23
0
 public void AddChild(SimpleTreeNode <T> ParentNode, SimpleTreeNode <T> NewChild)  // код добавления нового дочернего узла существующему ParentNode
 {
     if (Root == null)
     {
         Root       = NewChild;
         Root.layer = 1;
     }
     else
     {
         if (ParentNode.Children == null)
         {
             ParentNode.Children = new List <SimpleTreeNode <T> >();
         }
         ParentNode.Children.Add(NewChild);
         NewChild.Parent = ParentNode;
         NewChild.layer  = NewChild.Parent.layer + 1;
     }
 }
コード例 #24
0
 public void AddChild(SimpleTreeNode <T> ParentNode, SimpleTreeNode <T> NewChild)
 {
     if (Root == null)
     {
         Root       = NewChild;
         Root.level = 1;
     }
     else
     {
         if (ParentNode.Children == null)
         {
             ParentNode.Children = new List <SimpleTreeNode <T> >();
         }
         ParentNode.Children.Add(NewChild);
         NewChild.Parent = ParentNode;
         NewChild.level  = NewChild.Parent.level + 1;
     }
 }
コード例 #25
0
 public void DeleteNode(SimpleTreeNode <T> NodeToDelete)
 {
     // ваш код удаления существующего узла NodeToDelete
     if (NodeToDelete.Parent != null)
     {
         NodeToDelete.Parent.Children.Remove(NodeToDelete);
         if (NodeToDelete.Parent.Children.Count == 0)
         {
             NodeToDelete.Parent.Children = null;
         }
         NodeToDelete.Children = null;
         NodeToDelete.Parent   = null;
     }
     else
     {
         return;
     }
 }
コード例 #26
0
        public List <int> EvenTrees()
        {
            if (Count() % 2 == 1)
            {
                return(new List <int>());                 // при нечетном количестве возвращаем пустой список
            }
            // список листов
            List <SimpleTreeNode <T> > leafs = Recursive(Root).FindAll(
                delegate(SimpleTreeNode <T> node) { return(node.Children == null || node.Children.Count == 0); });

            List <int>         edges = new List <int>();   // создаем список связей
            SimpleTreeNode <T> previousLeafParrent = null; // используется для исключения повторного обхода от листьев с общим родителем

            foreach (var leaf in leafs)
            {
                if (previousLeafParrent != leaf.Parent)    // пропуск обхода от листов - соседей
                {
                    SimpleTreeNode <T> node = leaf.Parent; // проход от каждого листа
                    while (node != Root)
                    {
                        int nodesCount = Recursive(node).Count; // считать количество узлов узла
                        if (nodesCount % 2 == 0)                // при чётном числе узлов сохраняем связь узла и его родителя в список
                        {
                            if (typeof(T) == typeof(int))
                            {
                                // проверка, содержится ли такая связь в списке
                                if (!edges.Contains(Convert.ToInt32(node.Parent.NodeValue)) ||
                                    !edges.Contains(Convert.ToInt32(node.NodeValue)))
                                {
                                    edges.Add(Convert.ToInt32(node.Parent.NodeValue));
                                    edges.Add(Convert.ToInt32(node.NodeValue));
                                }
                            }
                        }

                        node = node.Parent; // переход к корню
                    }
                }

                previousLeafParrent = leaf.Parent;
            }

            return(edges);
        }
コード例 #27
0
        private int MarkEdges(List <T> forest, SimpleTreeNode <T> node)
        {
            int count = 1;

            if (node.Children == null)
            {
                return(count);
            }
            foreach (SimpleTreeNode <T> n in node.Children)
            {
                count += MarkEdges(forest, n);
            }
            if (count % 2 == 0 && node.Parent != null)
            {
                forest.Add(node.Parent.NodeValue);
                forest.Add(node.NodeValue);
                count = 0;
            }
            return(count);
        }
コード例 #28
0
        public void DeleteNode(SimpleTreeNode <T> NodeToDelete)
        {
            // ваш код удаления существующего узла NodeToDelete
            SimpleTreeNode <T>         ParentRemChild;
            List <SimpleTreeNode <T> > RootChildren = GetChildren(Root);

            foreach (SimpleTreeNode <T> node in RootChildren)
            {
                if (node == NodeToDelete)
                {
                    ParentRemChild = node.Parent;
                    ParentRemChild.Children.Remove(node);
                    if (ParentRemChild.Children.Count == 0)
                    {
                        ParentRemChild.Children = null;
                    }
                    return;
                }
            }
        }
コード例 #29
0
        public void AddChild()
        {
            Node11 = new SimpleTreeNode <int>(110, null);
            Node12 = new SimpleTreeNode <int>(120, null);

            // 1 child was added
            Tree.AddChild(Node0, Node11);
            Assert.AreEqual(777, Tree.Root.NodeValue);
            Assert.AreEqual(2, Tree.Root.Children.Count);
            Assert.AreEqual(Node0, Tree.Root.Children[0].Parent);
            Assert.AreEqual(12, Tree.Count());

            // 2 children were added
            Tree.AddChild(Node1, Node12);
            Assert.AreEqual(10, Tree.Root.Children[0].NodeValue);
            Assert.AreEqual(4, Tree.Root.Children[0].Children.Count);
            Assert.AreEqual(Node1, Tree.Root.Children[0].Children[0].Parent);
            Assert.AreEqual(120, Tree.Root.Children[0].Children[3].NodeValue);
            Assert.AreEqual(13, Tree.Count());
        }
コード例 #30
0
        public void AddChild(SimpleTreeNode <T> ParentNode, SimpleTreeNode <T> NewChild)
        {
            if (FindNodesByValue(ParentNode.NodeValue) != null)
            {
                SimpleTreeNode <T> targetNode = FindNodesByValue(ParentNode.NodeValue)[0]; // берём первый узел, если узлов с таким значением в дереве несколько

                if (targetNode.Children == null)
                {
                    targetNode.Children = new List <SimpleTreeNode <T> > {
                        NewChild
                    }
                }
                ;
                else
                {
                    targetNode.Children.Add(NewChild);
                }

                NewChild.Parent = targetNode;
            }
        }