Node4.java
Created with JBuilder
package t234;

/**
* Represents nodes with 4 subtrees of a 2-3-4 tree.
* It contains a left Tree234, a left data object, a left center Tree234, a center
* data object, a right center tree, a right data object, and a right Tree234.
* @since 11/13/01
* @author Dung X. Nguyen, Copyright 2001 - All Rights Reserved.
*/
class Node4 extends ANode234 {
    private Tree234 _leftTree  = new Tree234 ();      // Invariant:  _leftTree     != null
    private Integer _leftDat;	                      // Invariant:  _leftDat      != null
    private Tree234 _leftMidTree  = new Tree234 ();   // Invariant:  _leftMidTree  != null
    private Integer _midDat;	                      // Invariant:  _midDat       != null
    private Tree234 _rightMidTree  = new Tree234 ();  // Invariant:  _rightMidTree != null
    private Integer _rightDat;	                      // Invariant:  _rightDat     != null
    private Tree234 _rightTree  = new Tree234 ();     // Invariant:  _rightTree    != null
                                                 // Invariant:  _leftDat < _midDat < _rightDat.

    /**
    * Initializes this Node4 to contain 4 empty subtrees and the 3 input
    * parameters in the correct order.
    * @param lo < hi
    * @param hi > lo
    * @param n an Integer to be stored in this Node4 in the correct order.
    */
    Node4(Integer lo, Integer hi, Integer n) {
        int loVal = lo.intValue ();
        int hiVal = hi.intValue ();
        int nVal  = n.intValue ();
        if (hiVal < nVal) {
            _leftDat  = lo;
            _midDat   = hi;
            _rightDat = n;
        } else if (loVal < nVal)  { // nVal < hiVal.
            _leftDat  = lo;
            _midDat   = n;
            _rightDat = hi;
        } else {
            _leftDat  = n;
            _midDat   = lo;
            _rightDat = hi;
        }
    }

    /**
    * Initializes this Node4 to contain the 4 given subtrees and the 3 given
    * Integers in the correct order.
    * @param lTree != null, the new leftmost subtree whose elements < lN.
    * @param lN < mN, to be stored as the leftmost data, < all elements in lmTree
    * @param lmTree != null, the new middle-left subtree whose elements lmTree < mN
    * @param mN < rN, to be stored as the middle data, < all elements in rmTree
    * @param rmTree != null, the new middle-right subtree whose elements < rN.
    * @param rN, to be stored as the rightmost data, < all elements in rTree.
    * @param rTree != null, the new rightmost subtree
    */
    Node4(Tree234 lTree, Integer lN, Tree234 lmTree, Integer mN, Tree234 rmTree, Integer rN, Tree234 rTree) {
        _leftTree     = lTree;
        _leftDat      = lN;
        _leftMidTree  = lmTree;
        _midDat       = mN;
        _rightMidTree = rmTree;
        _rightDat     = rN;
        _rightTree    = rTree;
    }

    final boolean isEmpty(Tree234 owner) {
        return false;
    }

    /**
    * Called when there is no parent tree, i.e. this is the top level root:
    * Splits the node then inserts the data.
    */
    final void insert(Tree234 owner, Integer n) {
        int key = n.intValue ();
        if (key == _leftDat.intValue () || key == _midDat.intValue ()
            || key == _rightDat.intValue ()) {
            return;
        }
        Tree234 leftTree  = new Tree234(_leftTree, _leftDat, _leftMidTree);
        Tree234 rightTree = new Tree234(_rightMidTree, _rightDat, _rightTree);
        owner.changeRoot (new Node2(leftTree, _midDat, rightTree));
        owner.insert (n);
    }

    /**
     * Called when there is a parent tree.
     */
    final void insertHelper(Tree234 ownerPo, Tree234 owner, Integer n) {
        int key = n.intValue ();
        int midVal = _midDat.intValue ();
        if (key == _leftDat.intValue () || key == midVal
            || key == _rightDat.intValue ()) {
            return;
        }
        Tree234 leftTree  = new Tree234 (_leftTree, _leftDat, _leftMidTree);
        Tree234 rightTree = new Tree234 (_rightMidTree, _rightDat, _rightTree);
        ownerPo.attach (leftTree, _midDat, rightTree);
        if (key < midVal) {
            leftTree.insert(n);
        } else {
            rightTree.insert(n);
        }
    }

    final void attach (Tree234 owner, Tree234 lTree, Integer n, Tree234 rTree) {
        throw new IllegalStateException ("Node4.attach() should never be called.");
    }

    final void drawRootAndSubtrees(int level) {
        System.out.println (_leftDat + "  " + _midDat + "  " + _rightDat);
        _leftTree.drawAtLevel (level + 1);
        System.out.println ();
        _leftMidTree.drawAtLevel (level + 1);
        System.out.println ();
        _rightMidTree.drawAtLevel (level + 1);
        System.out.println ();
        _rightTree.drawAtLevel (level + 1);
    }
}


Node4.java
Created with JBuilder