// Allows the element to point
 // to the next element to grow from.
 public void leadTo(TreeConstructor next)
 {
     hasNext    = true;
     nextBranch = next;
 }
        //Generates a binary search tree from
        // data made available elsewhere
        public BinarySearchTree(int size, getNewKey keyGetter, getNewValue valueGetter, compareDelegate compare)
        {
            this.compare = compare;
            bool            latch        = true;
            TreeConstructor firstInChain = new TreeConstructor(0, size - 1);
            TreeConstructor workingBranch;
            TreeConstructor previousBranch;

            add(keyGetter(firstInChain.index), valueGetter(firstInChain.index));
            while (latch)
            {
                workingBranch = firstInChain;
                workingBranch.bud();
                if (false == workingBranch.leftBranch.atEnd())
                {
                    add(keyGetter(workingBranch.leftBranch.index),
                        valueGetter(workingBranch.leftBranch.index));
                }
                else
                {
                    latch = false;
                    if (workingBranch.leftBranch.valid())
                    {
                        add(keyGetter(workingBranch.leftBranch.index),
                            valueGetter(workingBranch.leftBranch.index));
                    }
                }
                if (false == workingBranch.rightBranch.atEnd())
                {
                    latch = true;
                    add(keyGetter(workingBranch.rightBranch.index),
                        valueGetter(workingBranch.rightBranch.index));
                }
                else
                {
                    latch = latch || false;
                    if (workingBranch.rightBranch.valid())
                    {
                        add(keyGetter(workingBranch.rightBranch.index),
                            valueGetter(workingBranch.rightBranch.index));
                    }
                }
                while (workingBranch.hasNext)
                {
                    previousBranch = workingBranch;
                    workingBranch  = workingBranch.nextBranch;
                    workingBranch.bud();
                    previousBranch.rightBranch.leadTo(workingBranch.leftBranch);
                    if (false == workingBranch.leftBranch.atEnd())
                    {
                        latch = true;
                        add(keyGetter(workingBranch.leftBranch.index),
                            valueGetter(workingBranch.leftBranch.index));
                    }
                    else
                    {
                        latch = latch || false;
                        if (workingBranch.leftBranch.valid())
                        {
                            add(keyGetter(workingBranch.leftBranch.index),
                                valueGetter(workingBranch.leftBranch.index));
                        }
                    }
                    if (false == workingBranch.rightBranch.atEnd())
                    {
                        latch = true;
                        add(keyGetter(workingBranch.rightBranch.index),
                            valueGetter(workingBranch.rightBranch.index));
                    }
                    else
                    {
                        if (workingBranch.rightBranch.valid())
                        {
                            add(keyGetter(workingBranch.rightBranch.index),
                                valueGetter(workingBranch.rightBranch.index));
                        }
                        latch = latch || false;
                    }
                }
                firstInChain = firstInChain.leftBranch;
            }
        }
 // Generates more constructor elements.
 public void bud()
 {
     leftBranch  = new TreeConstructor(minRange, index - 1);
     rightBranch = new TreeConstructor(index + 1, maxRange);
     leftBranch.leadTo(rightBranch);
 }