11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * in compliance with the License. You may obtain a copy of the License at
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software distributed under the
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * express or implied. See the License for the specific language governing permissions and
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect;
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkState;
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BstSide.LEFT;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BstSide.RIGHT;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Comparator;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A reusable abstraction for a node in a binary search tree. Null keys are allowed.
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The node is considered to be immutable. Any subclass with mutable fields must create a new
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code BstNode} object upon any mutation, as the {@code Bst} classes assume that two nodes
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code a} and {@code b} represent exactly the same tree if and only if {@code a == b}.
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>A {@code BstNode} can be considered to be an <i>entry</i>, containing a key and possibly some
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * value data, or it can be considered to be a <i>subtree</i>, representative of it and all its
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * descendants.
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param <K> The key type associated with this tree.
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param <N> The type of the nodes in this tree.
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertclass BstNode<K, N extends BstNode<K, N>> {
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * The key on which this binary search tree is ordered. All descendants of the left subtree of
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * this node must have keys strictly less than {@code this.key}.
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private final K key;
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * The left child of this node. A null value indicates that this node has no left child.
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Nullable
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private final N left;
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * The right child of this node. A null value indicates that this node has no right child.
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Nullable
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private final N right;
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  BstNode(@Nullable K key, @Nullable N left, @Nullable N right) {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    this.key = key;
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    this.left = left;
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    this.right = right;
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the ordered key associated with this node.
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Nullable
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public final K getKey() {
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return key;
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the child on the specified side, or {@code null} if there is no such child.
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Nullable
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public final N childOrNull(BstSide side) {
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    switch (side) {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      case LEFT:
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return left;
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      case RIGHT:
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return right;
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      default:
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        throw new AssertionError();
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns {@code true} if this node has a child on the specified side.
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public final boolean hasChild(BstSide side) {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return childOrNull(side) != null;
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns this node's child on the specified side.
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws IllegalStateException if this node has no such child
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public final N getChild(BstSide side) {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    N child = childOrNull(side);
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkState(child != null);
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return child;
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns {@code true} if the traditional binary search tree ordering invariant holds with
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * respect to the specified {@code comparator}.
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected final boolean orderingInvariantHolds(Comparator<? super K> comparator) {
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(comparator);
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    boolean result = true;
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (hasChild(LEFT)) {
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      result &= comparator.compare(getChild(LEFT).getKey(), key) < 0;
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (hasChild(RIGHT)) {
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      result &= comparator.compare(getChild(RIGHT).getKey(), key) > 0;
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return result;
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
126