// Textbook fragment 10.07 /** Implementation of an AVL tree. */ public class AVLTree extends BinarySearchTree implements Dictionary { public AVLTree(Comparator c) { super(c); } public AVLTree() { super(); } /** Nested class for the nodes of an AVL tree. */ protected static class AVLNode extends BTNode> { protected int height; // we add a height field to a BTNode AVLNode() {/* default constructor */} /** Preferred constructor */ AVLNode(Entry element, BTPosition> parent, BTPosition> left, BTPosition> right) { super(element, parent, left, right); height = 0; if (left != null) height = Math.max(height, 1 + ((AVLNode) left).getHeight()); if (right != null) height = Math.max(height, 1 + ((AVLNode) right).getHeight()); } // we assume that the parent will revise its height if needed public void setHeight(int h) { height = h; } public int getHeight() { return height; } } /** Creates a new binary search tree node (overrides super's version). */ protected BTPosition> createNode(Entry element, BTPosition> parent, BTPosition> left, BTPosition> right) { return new AVLNode(element,parent,left,right); // now use AVL nodes } /** Returns the height of a node (call back to an AVLNode). */ protected int height(Position> p) { return ((AVLNode) p).getHeight(); } /** Sets the height of an internal node (call back to an AVLNode). */ protected void setHeight(Position> p) { ((AVLNode) p).setHeight(1+Math.max(height(left(p)), height(right(p)))); } /** Returns whether a node has balance factor between -1 and 1. */ protected boolean isBalanced(Position> p) { int bf = height(left(p)) - height(right(p)); return ((-1 <= bf) && (bf <= 1)); }