1

I have created a BST and added values into it. However their is methods that require a TreeNode as a parameter. When passing a value as a param such as "10" after it has been added into the tree apparently this is not a valid param. How do I pass a param for the methods that require it as a param. for example their is a method I created that needs to know the node being searched for, it requires a treenode param. After I passed it a value I inserted in the tree (like I demonstrated earlier "10" it is not a valid param. I do not understand why it is not a valid param since it was added into the node. I am not changing the params from treenode that is how they come.

When passing a string to one of these methods it says : The method preorder(BST.TreeNode) in the type BST is not applicable for the arguments (String).

public class BST<E extends Comparable<E>> {
  int height = 0;  
  protected TreeNode<E> root;
  protected int size = 0;

  /** Create a default binary tree */
  public BST() {
  }

  /** Create a binary tree from an array of objects */
  public BST(E[] objects) {
    for (int i = 0; i < objects.length; i++)
      insert(objects[i]);
  }

  /** Returns true if the element is in the tree */
  public boolean search(E e) {
    TreeNode<E> current = root; // Start from the root

    while (current != null) {
      if (e.compareTo(current.element) < 0) {
        current = current.left;
      }
      else if (e.compareTo(current.element) > 0) {
        current = current.right;
      }
      else // element matches current.element
        return true; // Element is found
    }

    return false;
  }

  /** Insert element o into the binary tree
   * Return true if the element is inserted successfully */
  public boolean insert(E e) {
    if (root == null)
      root = createNewNode(e); // Create a new root
    else {
      // Locate the parent node
      TreeNode<E> parent = null;
      TreeNode<E> current = root;
      while (current != null)
        if (e.compareTo(current.element) < 0) {
          parent = current;
          current = current.left;
        }
        else if (e.compareTo(current.element) > 0) {
          parent = current;
          current = current.right;
        }
        else
          return false; // Duplicate node not inserted

      // Create the new node and attach it to the parent node
      if (e.compareTo(parent.element) < 0)
        parent.left = createNewNode(e);
      else
        parent.right = createNewNode(e);
    }

    size++;
    return true; // Element inserted
  }

  protected TreeNode<E> createNewNode(E e) {
    return new TreeNode<E>(e);
  }

  /** Inorder traversal from the root*/
  public void inorder() {
    inorder(root);
  }

  /** Inorder traversal from a subtree */
  protected void inorder(TreeNode<E> root) {
    if (root == null) return;
    inorder(root.left);
    System.out.print(root.element + " ");
    inorder(root.right);
  }

  /** Postorder traversal from the root */
  public void postorder() {
    postorder(root);
  }

  /** Postorder traversal from a subtree */
  protected void postorder(TreeNode<E> root) {
    if (root == null) return;
    postorder(root.left);
    postorder(root.right);
    System.out.print(root.element + " ");
  }

  /** Preorder traversal from the root */
  public void preorder() {
    preorder(root);
  }

  /** Preorder traversal from a subtree */
  protected void preorder(TreeNode<E> root) {
    if (root == null) return;
    System.out.print(root.element + " ");
    preorder(root.left);
    preorder(root.right);
  }

  /** This inner class is static, because it does not access 
      any instance members defined in its outer class */
  public static class TreeNode<E extends Comparable<E>> {
    protected E element;
    protected TreeNode<E> left;
    protected TreeNode<E> right;

    public TreeNode(E e) {
      element = e;
    }
  }

  /** Get the number of nodes in the tree */
  public int getSize() {
    return size;
  }

  /** Returns the root of the tree */
  public TreeNode<E> getRoot() {
    return root;
  }

  /** Returns a path from the root leading to the specified element */
  public java.util.ArrayList<TreeNode<E>> path(E e) {
    java.util.ArrayList<TreeNode<E>> list =
      new java.util.ArrayList<TreeNode<E>>();
    TreeNode<E> current = root; // Start from the root

    while (current != null) {
      list.add(current); // Add the node to the list
      if (e.compareTo(current.element) < 0) {
        current = current.left;
      }
      else if (e.compareTo(current.element) > 0) {
        current = current.right;
      }
      else
        break;
    }

    return list; // Return an array of nodes
  }

  /** Delete an element from the binary tree.
   * Return true if the element is deleted successfully
   * Return false if the element is not in the tree */
  public boolean delete(E e) {
    // Locate the node to be deleted and also locate its parent node
    TreeNode<E> parent = null;
    TreeNode<E> current = root;
    while (current != null) {
      if (e.compareTo(current.element) < 0) {
        parent = current;
        current = current.left;
      }
      else if (e.compareTo(current.element) > 0) {
        parent = current;
        current = current.right;
      }
      else
        break; // Element is in the tree pointed at by current
    }

    if (current == null)
      return false; // Element is not in the tree

    // Case 1: current has no left children
    if (current.left == null) {
      // Connect the parent with the right child of the current node
      if (parent == null) {
        root = current.right;
      }
      else {
        if (e.compareTo(parent.element) < 0)
          parent.left = current.right;
        else
          parent.right = current.right;
      }
    }
    else {
      // Case 2: The current node has a left child
      // Locate the rightmost node in the left subtree of
      // the current node and also its parent
      TreeNode<E> parentOfRightMost = current;
      TreeNode<E> rightMost = current.left;

      while (rightMost.right != null) {
        parentOfRightMost = rightMost;
        rightMost = rightMost.right; // Keep going to the right
      }

      // Replace the element in current by the element in rightMost
      current.element = rightMost.element;

      // Eliminate rightmost node
      if (parentOfRightMost.right == rightMost)
        parentOfRightMost.right = rightMost.left;
      else
        // Special case: parentOfRightMost == current
        parentOfRightMost.left = rightMost.left;     
    }

    size--;
    return true; // Element inserted
  }

  /** Obtain an iterator. Use inorder. */
  public java.util.Iterator<E> iterator() {
    return new InorderIterator();
  }

  // Inner class InorderIterator
  private class InorderIterator implements java.util.Iterator<E> {
    // Store the elements in a list
    private java.util.ArrayList<E> list =
      new java.util.ArrayList<E>();
    private int current = 0; // Point to the current element in list

    public InorderIterator() {
      inorder(); // Traverse binary tree and store elements in list
    }

    /** Inorder traversal from the root*/
    private void inorder() {
      inorder(root);
    }

    /** Inorder traversal from a subtree */
    private void inorder(TreeNode<E> root) {
      if (root == null)return;
      inorder(root.left);
      list.add(root.element);
      inorder(root.right);
    }

    /** More elements for traversing? */
    public boolean hasNext() {
      if (current < list.size())
        return true;

      return false;
    }

    /** Get the current element and move to the next */
    public E next() {
      return list.get(current++);
    }

    /** Remove the current element */
    public void remove() {
      delete(list.get(current)); // Delete the current element
      list.clear(); // Clear the list
      inorder(); // Rebuild the list
    }
  }

  /** Remove all elements from the tree */
  public void clear() {
    root = null;
    size = 0;
  }

  public double treeHeight(){
      double level = this.getSize();
      if (level ==0)
          return 0;
      if (level < 2){
          return level;
      }
      if(level == 2){
          return 2;
      }
      else
      while (level >= 2){
          height++;
          level = level/2;
      }
    return height++;  
  }

  public double numberOfNodeAtLevel(TreeNode node, double current,double desired){
      TreeNode<E> currentNode = root;
      if (currentNode == null){
          return 0;
      }
      if (currentNode.equals(node)){
      return 1;}

      else return numberOfNodeAtLevel(currentNode.left, current+1, desired)+
                  numberOfNodeAtLevel(currentNode.right, current+1, desired);


  }





  public static void main(String[] args){
      BST <String> c = new BST<String> ();
      c.insert("50");
      c.insert("25");
      c.insert("55");
      c.insert("13");
      c.insert("65");
      c.insert("10");
      c.insert("14");
      c.insert("54");

    numberOfNodeAtLevel("10",0,2) ;
    c.preorder();


  }
}
user3602515
  • 19
  • 1
  • 3
  • 10
  • Please post the error you get – ssnielsen Sep 28 '14 at 15:41
  • The method preorder(BST.TreeNode) in the type BST is not applicable for the arguments (String) – user3602515 Sep 28 '14 at 15:43
  • The method call, ``numberOfNodeAtLevel("hi",0,2);``, does not meet the signature of the method: ``public double numberOfNodeAtLevel(TreeNode node, double current,double desired)`` – ssnielsen Sep 28 '14 at 15:50
  • No but if I added "hi" into the tree why doesnt it? What can I put in as a param for one of the values I inserted in the tree? I changed it to "10" (a value in the tree) and it did not work. – user3602515 Sep 28 '14 at 15:53

1 Answers1

0

The method expects an object of type TreeNode and you pass a string. If you want to call it with the type you specified when initalizing the tree, use the generic type E:

public double numberOfNodeAtLevel(TreeNode node, double current,double desired){
    TreeNode<E> currentNode = root;
    if (currentNode == null){
        return 0;
    }
    if (currentNode.equals(node)){
        return 1;
    } else {
        return numberOfNodeAtLevel(currentNode.left, current+1, desired)+
              numberOfNodeAtLevel(currentNode.right, current+1, desired);
    }
}

You probably want to override the equals-method such that the fields element are compared - not the TreeNode-objects. Something like this:

public bool equals(Object obj) {
    return this.element.equals(((TreeNode) obj).element);
}
ssnielsen
  • 525
  • 5
  • 15
  • Now I cannot pass the method numberOfNodeAt the param currentNode.left – user3602515 Sep 28 '14 at 16:13
  • What is the method supposed to do? – ssnielsen Sep 28 '14 at 16:16
  • The method is supposed to tell me the number of nodes on a certain level of the tree. I kinda implemented it wrong. Here is what it should do. I pass it the root, the current level which is 0, and the desired level (the level that I want to know how many nodes are on) and it eventually after traversing tells me how many nodes are on that level. It is based off the algorithm in this post :http://stackoverflow.com/questions/12879903/binary-tree-counting-nodes-on-a-level – user3602515 Sep 28 '14 at 16:24