// 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); }