A 2-3 tree is a search tree with the following two properties:
2-3 trees have two different kinds of tree nodes, 2-nodes and 3-nodes.
2-nodes store one value (the key) and have a left child and a right child. All values stored in the subtree rooted at the left child are less than the key. All values stored in the subtree rooted at the right child are greater than the key. (In other words, 2-nodes are the same a binary search tree nodes.)
3-nodes store two values (smallKey and largeKey) and have a left child, a middle child, and a right child. All values stored in the subtree rooted at the left child are less than smallKey. All values stored in the subtree rooted at the middle child are greater than smallKey and less than largeKey. All values stored in the subtree rooted at the right child are greater than largeKey.
traverse(TwoThreeNode N)
if N is null, return
if N is a leaf
visit (e.g. print) the key(s) stored in N
else if N is a 2-node
traverse(N.left)
visit key
traverse(N.right)
else N is a 3-node
traverse(N.left)
visit small key
traverse(N.middle)
visit large key
traverse(N.right)
lookup(TwoThreeNode N, Comparable value)
if N is null, return null
if N is a leaf
if value is equal to (one of) the key(s) in N,
return the key
else if N is a 2-node
if value < N.key return lookup(N.left, value)
else return lookup(N.right, value)
else N is a 3-node
if value < N.smallKey
return lookup(N.left, value)
else if value > N.largeKey
return lookup(N.right, value)
else // N.smallKey < value < N.largeKey
return lookup(N.middle, value)
insert(TwoThreeNode N, Comparable value)
locate the leaf in which to put value (as in lookup)
if the leaf is a 2-node,
make it a 3-node
insert value as either smallKey or largeKey
if the leaf is a 3-node,
insert value (temporarily) so node now has 3 keys in it:
smallKey, middleKey, and largeKey
split the node
split(TwoThreeNode N)
if N is the root
make middleKey into a 2-node (which will be the new root)
make smallKey and largeKey into 2-nodes (which will be the
children of the new root)
redistribute children
else N has a parent P
move middleKey up to P
make smallKey and largeKey into 2-nodes (with parent P)
redistribute children if necessary
if P now has 3 keys in it, split P