/*
 * @(#)BalancedBSTTreeHead.java
 *
 * Last Modified: 9/15/01
 */

 import java.util.*;
 import java.awt.*;
 import java.awt.geom.*;


/** * This class provides the head structure for a <code>BalancedBSTTree</code>. Therefore,
	* it overides all important methods necessary for maintaining a
  	* Balanced BST.
	*
	* <p><hr>The <code>BalanceBSTTree</code> defines methods necessary for a BSTTreeHead, a DrawingBSTTreeHead, and an AnimatingBSTTreeHead.
	* The type is set when the node is constructed but can be changed in the middle using methods found in BSTTree. If a method is
	* called for a type that is higher is level than the type of the tree, the method will be ignored.
 	* @author  Corey Sanders
	* @version 3.4 9/15/01
 	*/
public class BalancedBSTTreeHead extends BSTTreeHead {


	/**************************************************************************************/
	/* RootInsertionBSTTreeHead constructor, methods, and variables, regardless of type.  */
	/**************************************************************************************/


	 /**
	  * String representing information regarding the type of tree.
	  */
	public static final String TREE_INFORMATION =
	"A Binary Search Tree(BST) is a binary tree that has a key associated with each of its\n"+
	"internal nodes, with the additional property  that the key in any node is larger than\n"+
	"(or equal to) the keys in all nodes in that node's left subtree and smaller than\n"+
	"(or equal to) the keys in all nodes in that node's right subtree (Sedgewick, 502).\n\n"+
	"We can balance most BSTs completely in linear time.\n"+
	"Such rebalancing is likely to improve pperformance for random keys, but does not\n"+
	 "provide guarantess against quadratic worst-case. (Sedgewick, 530).\n\n"+
	 "This tree is automatically rebalanced at a given node once one child has a size\n"+
	 "that is 5 greater then the other child. Five is an arbitrary value selected.\n\n"+
	"Search Hits, Search Misses, and Insertions require about 2 ln N (1.39 lg N) comparisons,\n"+
	"on the average, in a BST built from N random keys.\n\n"+
	"Search Hits, Search Misses, and Insertions can require N comparisons in the worst case.\n";

	/**
	  * Constructs a new, null BalancedBSTTreeHead, sorted according to the keys' natural
	  * order and insertion occurs automatically to the root.
	  *
	  * <p><b>Default type is BST_TREE_TYPE.</b>
      */
     public BalancedBSTTreeHead() {
		 this(0);
 	 }

 	 /**
 	  * Constructs a new, empty BalancedBSTTreeHead according to the type passed.
 	  *
 	  *
 	  *@param treeType type of tree that should be implemented.
 	  */
 	  public BalancedBSTTreeHead(int treeType) {
		  super(treeType);
	  	setBalanceDifference(DEFAULT_BALANCE_DIFFERENCE);
	  }


	  /**
	   * Gets the tree type String for the BSTTree.
	   *
	   * @return tree type String for the tree.
	   */
	   public String getTreeTypeString() {
	 		return "Balanced BST Tree";
	   }


	/**
	 * Acts according to the String action passed.Overides BSTTree, to stop <i>rapid-fire</i>
	 * insertion. For each insertion a rotateToTop must follow, which means insertion must enter the waitingList also!
	 *
	 *
	 * @param action String action representing the next action for the BSTTreeHead.
	 * @param element Object to which the action could be occuring, depending on the type of action.
	 */
	public void waitingAction(String action, Object element) {
		// search
		if (action.equals(TreeHead.INSERT_NODE)) {
			insertAnimatingType((BSTTree)element);
		}
		else {
			super.waitingAction(action, element);
		}

	}


	/*-----------------------------------------------------------------------*/
    /*-------------------------------BST_TREE_TYPE---------------------------*/
	/*-----------------------------------START-------------------------------*/
	/*-----------------------------------------------------------------------*/


	/**
	 * Double the difference between the left and right sizes for the tree to balance
	 * after each insertion or deletion.
	 */
	 private int balanceDifference;

	 /**
	  * Default balance probability. (1)
	  */
	  public static final int DEFAULT_BALANCE_DIFFERENCE = 1;


	/*************************************************************************/
	/* BST_TREE_TYPE : Methods and Variables specific to the BST_TREE_TYPE.  */
	/* These methods are universally used, regardless of the type of BST.    */
	/*************************************************************************/


	/**
	 * Makes and places the node into the tree. The node is returned for further manipulation.
	 * <p> Makes the node a <code>BalancedBSTTree</code>.
	 *
	 * @param keyInsert	comparable object which is added to the tree.
	 * @param valueInsert Object that accompanies keyInsert in the node.
	 *
	 * @return BSTTree that was recently inserted into the tree.
	 *
	 * @throws    ClassCastException key cannot be compared with the keys
	 *		  currently in the map.
	 */
	protected BSTTree makeNode(Comparable keyInsert, Object valueInsert) throws ClassCastException {

		// Get node from node factory.
		BalancedBSTTree newTree = new BalancedBSTTree(getTreeType());
		newTree.setHead(this);

		// Set the null leaves.
		newTree.setLeaf();


		// Set the values of the node.
		newTree.setNode(keyInsert, valueInsert);

		return newTree;
	}


	/**
	 * Gets the Balance Frequency for the Balanced BSTTree. The frequency is a double between
	 * 0.0 and 1.0 and is the probability that the tree will balance after every
	 * insert/delete.
	 *
	 * @return double probability of balancing the tree.
	 */
	 public int getBalanceDifference() {
		 return balanceDifference;
	 }

	/**
	 * Gets the Balance Frequency for the Balanced BSTTree. The frequency is a double between
	 * 0.0 and 1.0 and is the probability that the tree will balance after every
	 * insert/delete.
	 *
	 * @return double probability of balancing the tree.
	 */
	 public void setBalanceDifference(int balanceDifference) {
		 this.balanceDifference = balanceDifference;
	 }

	/**
 	 *************************************
	 * BST_TREE_TYPE Implements TreeHead *
	 *************************************
	 */


	/**
	 * Adds the node to the tree using its <i> natural ordering </i>.
	 * <p> Randomly balances the tree after each insertion.
	 *
	 * @param node	BSTTree which is added to the tree.
	 *
	 * @throws    ClassCastException key cannot be compared with the keys
	 *		  currently in the map.
	 */
	public void insert(Tree node) throws ClassCastException {

		super.insert(node);

	}


	/**
	 * Removes the given node from the tree. The accompanying value is also
	 * removed from the tree and the node is deleted.
	 * <p> Randomly balances the tree after each deletion.
	 *
	 * @param node the <code>Tree</code> node to be removed from the tree.
	 */
	public void remove(Tree node) {

		super.remove(node);

	}



  	/*-----------------------------------------------------------------------*/
    /*-------------------------------BST_TREE_TYPE---------------------------*/
	/*------------------------------------END--------------------------------*/
	/*-----------------------------------------------------------------------*/





    /*/////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
    /*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\//////////////////////////////////*/




	/*-----------------------------------------------------------------------*/
    /*---------------------------ANIMATING_BST_TREE_TYPE---------------------*/
	/*-----------------------------------START-------------------------------*/
	/*-----------------------------------------------------------------------*/


	/**
 	 *********************************************
	 * ANIMATING_BST_TREE_TYPE Overiding methods *
	 *********************************************
	 */

	/**
	 * Insert the comaparable node to the tree using its <i> natural ordering </i>.
	 *
	 * <p>Makes <code>insert</code> a waitingAction if the tree is animating.
	 *
	 * @param node BSTTree node to be inserted into the tree
	 * @throws    ClassCastException key cannot be compared with the keys
	 *		  currently in the map.
	 */
	protected void insertAnimatingType(BSTTree node) throws ClassCastException {

		// If Animation is occuring, add INSERT_NODE to the waitingList.
		if (isTreeAnimating()) {
			getWaitingList().add(AnimatingTreeHead.INSERT_NODE, node);
		}
		else {
			super.insertAnimatingType(node);
		}
	}


}


