Пример #1
0
 public void Insert(T value)
 {
     if (Root == null)
     {
         Root        = new BalancedTreeNode <T>(value);
         Root.Parent = Root;
     }
     else
     {
         BalancedTreeNode <T> Curr = Root;
         do
         {
             for (; Curr.IsFull(); Curr = GetNextChild(Curr, value))
             {
                 Split(Curr);
                 Curr = Curr.GetParent();
             }
             //Children = new List<BalancedTreeNode<T>>();
             if (!Curr.IsLeaf() && Curr == Root)
             {
                 Curr = GetNextChild(Curr, value);
             }
             else
             {
                 Curr.InsertItem(value);
                 Curr.Reverse();
                 return;
             }
         } while (true);
     }
 }
Пример #2
0
 public BalancedTreeNode <T> GetNextChild(BalancedTreeNode <T> node, T value)
 {
     if (DoCompare(node.Data[0], value) == Comparet.LESSTHAN)
     {
         if (node.Children == null)
         {
             node.Children = new List <BalancedTreeNode <T> >();
             BalancedTreeNode <T> newNode = null;
             node.Children.Add(newNode);
         }
         node = node.Children[1];
     }
     else if (DoCompare(node.Data[0], value) == Comparet.GREATER)
     {
         if (node.Children == null)
         {
             node.Children = new List <BalancedTreeNode <T> >();
             BalancedTreeNode <T> newNode = null;
             node.Children.Add(newNode);
         }
         node = node.Children[0];
     }
     else
     {
         throw new Exception("Duplicate value");
     }
     return(node);
 }
Пример #3
0
        public void InsertChild(BalancedTreeNode <T> node)
        {
            if (Children == null)
            {
                Children = new List <BalancedTreeNode <T> >();
            }
            for (int x = 0; x < Children.Count; x++)
            {
                if (DoCompare(Children[x].Data[0], node.Data[0]) == Comparet.GREATER)
                {
                    Children.Insert(x, node);
                    return;
                }
            }

            Children.Add(node);
            node.Parent = this;
        }
Пример #4
0
 public void Print(BalancedTreeNode <T> binaryTreeNode, String pos)
 {
     //if (binaryTreeNode.Data != null)
     //{
     //    for (int i = 0; i < binaryTreeNode.Data.Count(); i++)
     //    {
     //        //if (i == 0)
     //        //{
     //        //    Console.Write("{0} Node: ", pos);
     //        //}
     //        Console.Write(binaryTreeNode.Data[i] + " ");
     //        //if (i == binaryTreeNode.Data.Count() - 1)
     //        //{
     //        //    Console.WriteLine();
     //        //}
     //    }
     //    if (binaryTreeNode.LeftNode != null)
     //    {
     //        foreach (var item in binaryTreeNode.LeftNode.Data)
     //        {
     //            Console.Write(item + " ");
     //        }
     //    }
     //    if (binaryTreeNode.CenterNode != null)
     //    {
     //        foreach (var item in binaryTreeNode.CenterNode.Data)
     //        {
     //            Console.Write(item + " ");
     //        }
     //    }
     //    if (binaryTreeNode.RightNode != null)
     //    {
     //        foreach (var item in binaryTreeNode.RightNode.Data)
     //        {
     //            Console.Write(item + " ");
     //        }
     //    }
     //}
 }
Пример #5
0
 public BalancedTree()
 {
     Root = null;
 }
Пример #6
0
        public void Split(BalancedTreeNode <T> node)
        {
            //BalancedTreeNode<T> newRoot = new BalancedTreeNode<T>(node.Data[1]);
            //BalancedTreeNode<T>[] newNodes = { };
            //if (node.IsFull())
            //{
            //    if (node == Root)
            //    {
            //        if (node.Children != null && node.Children.Count == 2)
            //        {
            //            BalancedTree<T> balancedTree = new BalancedTree<T>();
            //            balancedTree.Root.Data.Add(node.Data[1]);
            //            BalancedTreeNode<T> firstnode = new BalancedTreeNode<T>(node.Data[0]);
            //            balancedTree.Root.Children.Add(firstnode);
            //            BalancedTreeNode<T> secondnode = new BalancedTreeNode<T>(node.Data[1]);
            //            balancedTree.Root.Children.Add(secondnode);
            //        }
            //        else
            //        {
            //            // change node to Root 17:18
            //            BalancedTreeNode<T> newRight = new BalancedTreeNode<T>(Root.Data[2]);
            //            if (Root.Children == null)
            //            {
            //                Root.Children = new List<BalancedTreeNode<T>>();
            //            }
            //            for (int x = 2; x < Root.Children.Count; x++)
            //            {
            //                if (newRight.Children == null)
            //                {
            //                    newRight.Children = new List<BalancedTreeNode<T>>();
            //                }
            //                newRight.Children.Add(Root.Children[x]);
            //            }

            //            for (int x = Root.Children.Count() - 1; x >= 2; x--)
            //            {
            //                Root.Children.RemoveAt(x);
            //            }

            //            for (int x = 2; x > 0; x--)
            //            {
            //                Root.Data.RemoveAt(x);
            //            }

            //            newNodes = new BalancedTreeNode<T>[] { node, newRight };
            //            newRoot.InsertChild(newNodes[0]);
            //            newRoot.InsertChild(newNodes[1]);
            //            Root = newRoot;
            //            Root.Parent = Root; // 17:47
            //        }
            //    }
            //    else
            //    {
            //        Root.Data.Add(node.Data[1]);
            //        Root.Reverse();
            //        if (Root.IsFull())
            //        {
            //            Split(Root);
            //        }
            //        Root.Children.Add(Root.Children[1]);
            //        Root.Children.RemoveAt(1);
            //        BalancedTreeNode<T> newNode = new BalancedTreeNode<T>(node.Data[2]);
            //        Root.Children.Insert(1, newNode);
            //        node.Data.RemoveRange(1, 2);

            //        Root.Parent = Root; // 17:47
            //    }
            //}

            if (node.IsFull())
            {
                BalancedTreeNode <T> newNode = new BalancedTreeNode <T>(node.Data[1]);
                if (node.Children == null)
                {
                    node.Children = new List <BalancedTreeNode <T> >();
                }
                for (int x = 2; x < node.Children.Count; x++)
                {
                    newNode.Children.Add(node.Children[x]);
                }
                for (int x = node.Children.Count - 1; x >= 2; x--)
                {
                    node.Children.RemoveAt(x);
                }
                for (int x = 1; x < node.Data.Count; x++)
                {
                    node.Data.RemoveAt(1);
                }
                Root.Children.Add(node);
                Root.Children.Add(newNode);
            }
        }