code: private final TreeEntry<K, V> getRoundEntry(final K key, final boolean upORdown, final boolean acceptEqual) {
  		if (!validState) {
  			throw new InvalidStateException();
  		}
  		if (_isEmpty()) {
  			return null;
  		}
  		if (key == null) {
  			return null;
  		}
  		try {
  			LeafNode<K, V> node = findLeafNode(key, false);
  			if (node == null) {
  				return null;
  			}
  			int slot = node.findSlotByKey(key);
  			if (upORdown) {
  				// ceiling / higher
  				slot = ((slot < 0) ? (-slot) - 1 : (acceptEqual ? slot : slot + 1));
  				if (slot >= node.allocated) {
  					node = node.nextNode();
  					if (node == null) {
  						return null;
  					}
  					slot = 0;
  				}
  			} else {
  				// floor / lower
  				slot = ((slot < 0) ? (-slot) - 2 : (acceptEqual ? slot : slot - 1));
  				if (slot < 0) {
  					node = node.prevNode();
  					if (node == null) {
  						return null;
  					}
  					slot = node.allocated - 1;
  				}
  			}
  			return ((node.keys[slot] == null) ? null
  					: new TreeEntry<K, V>(node.keys[slot], node.values[slot]));
  		} finally {
  			releaseNodes();
  		}
  	}
docs: Return ceilingEntry, floorEntry, higherEntry or lowerEntry
  
  @param key the key
  @param upORdown true returns ceiling/higher, false floor/lower
  @param acceptEqual true returns equal keys, otherwise, only higher or lower
  @return the Entry found or null if not found