package t234;
/**
* Represents nodes with only 3 subtrees of a 2-3-4 tree.
* It contains a left Tree234, a left data object, a middle Tree234, a right
* data object, and a right Tree234.
* @since 11/13/01
* @author Dung X. Nguyen, Copyright 2001 - All Rights Reserved.
*/
class Node3 extends ANode234 {
private Tree234 _leftTree = new Tree234 (); // Invariant: _leftTree != null
private Integer _leftDat; // Invariant: _leftDat != null
private Tree234 _midTree = new Tree234 (); // Invariant: _midTree != null
private Integer _rightDat; // Invariant: _rightDat != null
private Tree234 _rightTree = new Tree234 ();// Invariant: _rightTree != null
// Invariant: _leftDat < _rightDat
/**
* Initializes this Node3 to contain 2 Integers sorted in ascendig order
* and three empty subtrees.
* @param n0 != null
* @param n1 != null
*/
Node3(Integer n0, Integer n1) {
if (n0.intValue () < n1.intValue ()) {
_leftDat = n0;
_rightDat = n1;
}
else {
_leftDat = n1;
_rightDat = n0;
}
}
/**
* Initializes this Node3 to contain two given Integers and the given left,
* middle, and right subtrees.
* @param lTree != null the left subtree whose elements are less than lN.
* @param lN != null less than all elements in mTree.
* @param mTree != null the middle subtree whose elements are less than rN.
* @param rN != null less than all elements in rTree.
* @param rTree != null the right subtree
*/
Node3(Tree234 lTree, Integer lN, Tree234 mTree, Integer rN, Tree234 rTree) {
_leftTree = lTree;
_leftDat = lN;
_midTree = mTree;
_rightDat = rN;
_rightTree = rTree;
}
final boolean isEmpty (Tree234 owner) {
return false;
}
final void insert (Tree234 owner, Integer n) {
int leftVal = _leftDat.intValue ();
int rightVal = _rightDat.intValue ();
int key = n.intValue ();
if ((key == leftVal) || (key == rightVal)) {
return;
}
if (_leftTree.isEmpty() && _midTree.isEmpty() && _rightTree.isEmpty()) { // leaf node.
owner.changeRoot(new Node4(_leftDat, _rightDat, n));
} else {//owner is parent of left, center, and right subtrees.
if (key < leftVal) {
_leftTree.insertHelper(owner, n);
} else if (rightVal < key) {
_rightTree.insertHelper(owner, n);
} else {
_midTree.insertHelper(owner, n);
}
}
}
final void insertHelper (Tree234 ownerPo, Tree234 owner, Integer n) {
owner.insert(n); // can call insert (owner, n) instead.
}
final void attach (Tree234 owner, Tree234 lTree, Integer n, Tree234 rTree) {
int key = n.intValue ();
Node4 topNode
= key < _leftDat.intValue()?
new Node4(lTree, n, rTree, _leftDat, _midTree, _rightDat, _rightTree):
_rightDat.intValue() < key?
new Node4(_leftTree, _leftDat, _midTree, _rightDat, lTree, n, rTree):
new Node4(_leftTree, _leftDat, lTree, n, rTree, _rightDat, _rightTree);
owner.changeRoot (topNode);
}
final void drawRootAndSubtrees(int level) {
System.out.println(_leftDat + " " + _rightDat);
_leftTree.drawAtLevel (level + 1);
System.out.println();
_midTree.drawAtLevel(level + 1);
System.out.println();
_rightTree.drawAtLevel(level + 1);
}
}