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