boolean rangeQuery_internal(Node currentNode, QueryBox queryBox, int rangeX1, int rangeX2, List<E> result) { boolean toContinue = true; if (currentNode != null) { if (currentNode.y <= queryBox.upperY) { // the current node is within the y constraint if (queryBox.x1 <= currentNode.x && currentNode.x <= queryBox.x2) { // The current node is contained in the query box result.add(currentNode.elem); } // search the descendant nodes int middleX = currentNode.splitX; // search the left tree if (toContinue && queryBox.x1 < middleX) { toContinue = rangeQuery_internal(currentNode.left, queryBox, rangeX1, middleX, result); } // search the right tree if (toContinue && middleX <= queryBox.x2) { toContinue = rangeQuery_internal(currentNode.right, queryBox, middleX, rangeX2, result); } } } return toContinue; }
/** * Retrieves elements contained in the specified range, (X:[x1, x2], Y:[ , * upperY]). This query is useful for answering the interval intersection * problem. * * @param x1 * @param x2 * @param upperY * @return elements contained in the range (X:[x1, x2], Y:[ , upperY]) */ public List<E> rangeQuery(int x1, int x2, int upperY) { ArrayList<E> result = new ArrayList<E>(); rangeQuery_internal(root, new QueryBox(x1, x2, upperY), x1, x2, result); return result; }