Exemplo n.º 1
0
 /**
  * Returns the left or right child of a node depending the specified side
  *
  * @param node Parent Node
  * @param side Specified side
  * @return Child node based on size
  */
 protected TreeNode<K, V> getChildNode(TreeNode<K, V> node, Side side) {
   switch (side) {
     case LEFT:
       return node.getLeftNode();
     case RIGHT:
       return node.getRightNode();
   }
   return null;
 }
Exemplo n.º 2
0
  /**
   * Deletes a node with the specified key, if one is found, and stores the path traveled path in
   * path
   *
   * @param key Key to remove
   * @param path Traveled path
   * @return The deleted node's value, if no node was found returns null
   */
  protected V delete(K key, Path<TreeNode<K, V>> path) {
    TreeNode<K, V> node = this.findNode(key, path);
    if (node == null) {
      return null;
    }

    V result = node.getValue();
    if (node.getLeftNode() == null) {
      this.joinTrees(node.getRightNode(), path.getLastParent(), path.getLastSide());
    } else if (node.getRightNode() == null) {
      this.joinTrees(node.getLeftNode(), path.getLastParent(), path.getLastSide());
    } else {
      path.addRightStep(node);
      TreeNode<K, V> minNode = this.getLeafBySide(node.getRightNode(), Side.LEFT, path);
      node.setKey(minNode.getKey());
      node.setValue(minNode.getValue());
      this.joinTrees(minNode.getRightNode(), path.getLastParent(), path.getLastSide());
    }
    super.size--;
    return result;
  }
Exemplo n.º 3
0
  /**
   * Returns the node with a given key and fills the path variable with the corresponding
   * information
   *
   * @param key Key to search for
   * @param path Path variable to fill
   * @return The node with a given key
   */
  protected TreeNode<K, V> findNode(K key, Path<TreeNode<K, V>> path) {
    path.addRightStep(null);

    TreeNode<K, V> node = this.root;

    while (node != null) {
      int comparisonResult = node.getKey().compareTo(key);
      if (comparisonResult < 0) {
        if (path != null) path.addRightStep(node);
        node = node.getRightNode();
      } else if (comparisonResult > 0) {
        if (path != null) path.addLeftStep(node);
        node = node.getLeftNode();
      } else {
        return node;
      }
    }

    return null;
  }