Пример #1
0
        private static void ZigZag(BinarySearchTreeNode node, BinarySearchTreeNode.SideOfParent side)
        {
            var p = node.Parent;
            var q = node.Parent.Parent;

            BinarySearchTreeNode.ReplaceChild(q.Parent, q, node);
            p.Parent = node;
            q.Parent = node;

            var nl = node.Left;
            var nr = node.Right;

            if (side == BinarySearchTreeNode.SideOfParent.LEFT)
            {
                node.Left  = q;
                node.Right = p;
                p.Left     = nr;
                q.Right    = nl;
            }
            else
            {
                node.Left  = p;
                node.Right = q;
                p.Right    = nl;
                q.Left     = nr;
            }
        }
Пример #2
0
        private static void Zig(BinarySearchTreeNode node, BinarySearchTreeNode.SideOfParent side)
        {
            var p = node.Parent;

            BinarySearchTreeNode.ReplaceChild(p.Parent, p, node);

            if (side == BinarySearchTreeNode.SideOfParent.LEFT)
            {
                var nr = node.Right;
                node.Right = p;
                p.Left     = nr;
            }
            else
            {
                var nl = node.Left;
                node.Left = p;
                p.Right   = nl;
            }
        }
Пример #3
0
        public static BinarySearchTreeNode Delete(BinarySearchTreeNode node)
        {
            if (node.Right == null)
            {
                var nl = node.Left;
                BinarySearchTreeNode.ReplaceChild(node.Parent, node, nl);
                node.Erase();

                return(nl);
            }

            var next = Next(node);

            BinarySearchTreeNode.ReplaceChild(next.Parent, next, next.Right);
            BinarySearchTreeNode.ReplaceChild(node.Parent, node, next);
            next.Left  = node.Left;
            next.Right = node.Right;
            node.Erase();

            return(next);
        }