示例#1
0
 public BinomialNode(int key, BinomialNode parent = null, BinomialNode left = null, BinomialNode right = null, int degree = 0)
 {
     Data       = key;
     Parent     = parent;
     LeftChild  = left;
     RightChild = right;
     Degree     = degree;
 }
示例#2
0
        public void Add(int value)
        {
            var node = new BinomialNode(value);

            if (Roots.ContainsKey(node.Degree))
            {
                Merge(node, Roots[node.Degree]);
            }
            else
            {
                Roots[node.Degree] = node;
            }
        }
示例#3
0
        private void Merge(BinomialNode newNode, BinomialNode rootsNode)
        {
            if (newNode.Degree != rootsNode.Degree)
            {
                throw new InvalidOperationException("Forbidden to merge trees of different sizes");
            }
            Roots.Remove(rootsNode.Degree);
            BinomialNode node;

            if (newNode.Data > rootsNode.Data)
            {
                node                 = new BinomialNode(newNode.Data, null, rootsNode, null, newNode.Degree + 1);
                rootsNode.Parent     = node;
                rootsNode.RightChild = newNode.LeftChild;
                if (newNode.LeftChild != null)
                {
                    newNode.LeftChild.Parent = rootsNode;
                }
            }
            else
            {
                node               = new BinomialNode(rootsNode.Data, null, newNode, null, rootsNode.Degree + 1);
                newNode.Parent     = node;
                newNode.RightChild = rootsNode.LeftChild;
                if (rootsNode.LeftChild != null)
                {
                    rootsNode.LeftChild.Parent = newNode;
                }
            }

            if (Roots.ContainsKey(node.Degree))
            {
                var currentNode = Roots[node.Degree];
                Roots.Remove(node.Degree);
                Merge(node, currentNode);
            }
            else
            {
                Roots[node.Degree] = node;
            }
        }