Example #1
0
        static public void rightturn(BlackRedthree node, int key)
        {
            BlackRedthree leftchild = node.left;

            leftchild.parent = node.parent; /* при этом, возможно, rigthchild становится корнем дерева */
            if (node.parent != null)
            {
                if (node.parent.left == node)
                {
                    node.parent.left = leftchild;
                }
                else
                {
                    node.parent.right = leftchild;
                }
            }
            node.left = leftchild.right;
            if (leftchild.right != null)
            {
                leftchild.right.parent = node;
            }

            node.parent     = leftchild;
            leftchild.right = node;
            //new BlackRedthree(key);
        }
Example #2
0
 static void write(BlackRedthree node)
 {
     Console.WriteLine(node.key + "  " + node.Color);
     Console.WriteLine(node.parent.key + "  " + node.parent.Color);
     if (node.parent.left == node)
     {
         write(node.parent);
     }
 }
Example #3
0
 static public BlackRedthree grandparent(ref BlackRedthree node)
 {
     if ((node != null) && (node.parent != null))
     {
         return(node.parent.parent);
     }
     else
     {
         return(null);
     }
 }
Example #4
0
 //static void Symon(BlackRedthree node,int key)
 //{
 //    insert_case1(node);
 //}
 static public void insert_case1(BlackRedthree node, int key)
 {
     if (node.parent == null)
     {
         node.Color = 0;
         //  node = new BlackRedthree(key);
     }
     else
     {
         insert_case2(node, key);
     }
 }
Example #5
0
 static void insert_case2(BlackRedthree node, int key)
 {
     if (node.parent.Color == 0)
     {
         //     node = new BlackRedthree(key);
         return; /* Tree is still valid */
     }
     else
     {
         insert_case3(node, key);
     }
 }
Example #6
0
        static void insert_case5(BlackRedthree node, int key)
        {
            BlackRedthree node1 = grandparent(ref node);

            node.parent.Color = 0;
            node1.Color       = 1;
            if ((node == node.parent.left) && (node.parent == node1.left))
            {
                rightturn(node1, key);
            }
            else /* (n == n->parent->right) && (n->parent == g->right) */
            {
                leftturn(node1, key);
            }
        }
Example #7
0
        static public BlackRedthree uncle(ref BlackRedthree node)
        {
            BlackRedthree node1 = grandparent(ref node);

            if (node == null)
            {
                return(null); // No grandparent means no uncle
            }
            if (node.parent == node1.left)
            {
                return(node1.right);
            }
            else
            {
                return(node1.left);
            }
        }
Example #8
0
        static public void insert(ref BlackRedthree node, int key)
        {
            if (node.parent == null)
            {
                node.parent = null;
                node.left   = null;
                node.right  = null;
                node.Color  = 0;      //black
            }
            else
            {
                //while (node != null)
                //{
                //     node.parent = node;
                //    if (key < node.key)
                //    {
                //        node = node.left;
                //    }
                //    else             // if (key > node.key)
                //    {
                //        node = node.right;
                //    }
                //}
                //BlackRedthree newNode = new BlackRedthree();


                //if (node.parent == null)
                //{
                //    node = newNode;
                //}
                //if (key < node.parent.key)
                //{
                //    Console.WriteLine(key);
                //    node.parent.left = newNode;
                //}
                //else      // if (key > node.parent.key)
                //{
                //    Console.WriteLine(key);
                //    node.parent.right = newNode;
                //}
            }
            // Console.WriteLine("gg");
        }
Example #9
0
        static void insert_case3(BlackRedthree node, int key)
        {
            BlackRedthree node1 = uncle(ref node);
            BlackRedthree node2;

            if ((node1 != null) && (node1.Color == 1))
            {
                // && (n->parent->color == RED) Второе условие проверяется в insert_case2, то есть родитель уже является красным.
                node.parent.Color = 0;
                node1.Color       = 0;
                node2             = grandparent(ref node);
                node2.Color       = 1;
                //node = new RBT(key);
                insert_case1(node2, key);
            }
            else
            {
                insert_case4(node, key);
            }
        }
Example #10
0
        static void Main(string[] args)
        {
            BlackRedthree root2 = new BlackRedthree();
            BlackRedthree root1 = new BlackRedthree();

            insert_case1(root1, 20);
            insert_case1(root1, 40);
            insert_case1(root1, 15);
            insert_case1(root1, 5);
            insert_case1(root1, 151);
            insert_case1(root1, 149);
            insert_case1(root1, 78);
            insert_case1(root1, 40);
            write(root1);
            // insert(ref root1, 40);
            // insert(ref root1, 50);
            //   insert(ref root1, 401);
            //     insert_case1(root2);



            Console.ReadKey();
        }
Example #11
0
        static void insert_case4(BlackRedthree node, int key)
        {
            BlackRedthree node1 = grandparent(ref node);

            if ((node == node.parent.right) && (node.parent == node1.left))
            {
                leftturn(node.parent, key);

                /*
                 * rotate_left может быть выполнен следующим образом, учитывая что уже есть *g =  grandparent(n)
                 *
                 * struct node *saved_p=g->left, *saved_left_n=n->left;
                 * g->left=n;
                 * n->left=saved_p;
                 * saved_p->right=saved_left_n;
                 *
                 */
                node = node.left;
            }
            else if ((node == node.parent.left) && (node.parent == node1.right))
            {
                rightturn(node.parent, key);

                /*
                 * rotate_right может быть выполнен следующим образом, учитывая что уже есть *g =  grandparent(n)
                 *
                 * struct node *saved_p=g->right, *saved_right_n=n->right;
                 * g->right=n;
                 * n->right=saved_p;
                 * saved_p->left=saved_right_n;
                 *
                 */

                node = node.right;
            }
            insert_case5(node, key);
        }