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