/**
* Auxiliary method called by insertItem and removeElement.
* Traverses the path of T from the given node to the root. For
* each node zPos encountered, recomputes the height of zPos and
* performs a trinode restructuring if zPos is unbalanced.
*/
private void rebalance(Position zPos) {
while (!T.isRoot(zPos)) {
zPos = T.parent(zPos);
setHeight(zPos);
if (!isBalanced(zPos)) {
// perform a trinode restructuring
Position xPos = tallerChild(tallerChild(zPos));
zPos = ((RestructurableNodeBinaryTree) T).restructure(xPos);
setHeight(T.leftChild(zPos));
setHeight(T.rightChild(zPos));
setHeight(zPos);
}
}
}
// methods of the dictionary ADT
/** Overrides the corresponding method of the parent class. */
public void insertItem(Object key, Object element)
throws InvalidKeyException {
super.insertItem(key, element); // may throw an InvalidKeyException
Position zPos = actionPos; // start at the insertion position
T.replaceElement(zPos, new AVLItem(key, element, 1));
rebalance(zPos);
}
/** Overrides the corresponding method of the parent class. */
public Object removeElement(Object key)
throws InvalidKeyException {
Object toReturn = super.removeElement(key);
// may throw an InvalidKeyException
if(toReturn != NO_SUCH_KEY) {
Position zPos = actionPos; // start at the removal position
rebalance(zPos);
}
return toReturn;
}