inOrderIterator方法不能应用于BinaryTreeNode <t> </t>

时间:2013-12-10 18:17:37

标签: java recursion binary-search-tree singly-linked-list inorder

使用InOrderIterator遍历方法。我理解如何以递归方式执行此操作,但我不断收到此编译器错误。

inOrderIterator() in LinkedBinarySearchTree<T> cannot be applied to (BinaryTreeNode<T>)

我不知道为什么我不能将此方法应用于该对象。有任何想法吗? 到目前为止,这是我的方法

public ArrayList<T> inOrderIterator()
{
  ArrayList<T> myArr = new ArrayList<T>();
  BinaryTreeNode<T> currentNode = this.root;
  if(currentNode != null)
  {
     inOrderIterator(currentNode.getLeftChild());
     myArr.add(currentNode.getElement());
     inOrderIterator(currentNode.getRightChild());
  }

  return myArr;
}

LinkedBinarySearchTree.java

import jss2.exceptions.EmptyCollectionException;
import jss2.exceptions.ElementNotFoundException;
import java.util.ArrayList;


public class LinkedBinarySearchTree<T extends Comparable<T>> 
{

private T elem;
BinaryTreeNode<T> root;

public LinkedBinarySearchTree (T element)  
{
  elem = element;
  root = null;
}

public LinkedBinarySearchTree ()  
{
  root = null;
}

public void addToTree (T element)  
{

  //Check if root is null
  if(root == null)
  {
     root.getElement().equals(element);
  }
  else
  {
     addToTreeHelper(root, element);
  }
}

 public void addToTreeHelper(BinaryTreeNode<T> node, T target)
{
  BinaryTreeNode<T> child;
  BinaryTreeNode<T> targetNode = new BinaryTreeNode<T>(target);

  if(target.compareTo(node.getElement()) == -1)
  {
     child = node.getLeftChild();

     if(child == null)
     {
        node.setLeftChild(targetNode);
     }

     else
     {
        addToTreeHelper(node.getLeftChild(), target);
     }
  }

  else if(target.compareTo(node.getElement()) >= 0)
  {
     child = node.getRightChild();

     if(child == null)
     {
        node.setRightChild(targetNode);
     }

     else
     {
        addToTreeHelper(node.getRightChild(), target);
     }
  }
}


  //remove Element

  public void removeElement(T target) throws Exception
  {
  BinaryTreeNode<T> node;

  if(root.getElement() == null)
  {
     throw new EmptyCollectionException("tree is empty");
  }

  else if(target.compareTo(root.getElement()) == 0)
  {
     root = getReplacement(root);

  }

  else
  {
     node = removeElemHelper(root, target);
     if(node ==  null)
     {
        throw new ElementNotFoundException ("not found "+target.toString());
     }
  }
  }

  //remove element helper

 public BinaryTreeNode<T> removeElemHelper(BinaryTreeNode<T> node, T target)
 {

  BinaryTreeNode<T> result, child, replacement;
  result = null;
  if(node != null)
  {
     if(target.compareTo(node.getElement()) == -1)
     {
        child = node.getLeftChild();
        if(child != null && target.compareTo(child.getElement()) == 0)
        {
           result = child;
           replacement = getReplacement(child);
           if(replacement == null)
           {
              node.setLeftChild(null);
           }
           else
           {
              node.setLeftChild(replacement);
           }
        }

        else
        {
           result = removeElemHelper(child, target);
        }
     }

     //
     else if(target.compareTo(node.getElement()) == 1)
     {
        child = node.getRightChild();
        if(child != null && target.compareTo(child.getElement()) == 0)
        {
           result = child;
           replacement = getReplacement(child);
           if(replacement == null)
           {
              node.setRightChild(null);
           }
           else
           {
              node.setRightChild(replacement);
           }
        }

        else
        {
           result = removeElemHelper(child, target);
        }
     }

  } 

  return result; 
}

 //replacement
 public BinaryTreeNode<T> getReplacement(BinaryTreeNode<T> node)
 {
  BinaryTreeNode<T> result,leftChild, rightChild;
  leftChild = node.getLeftChild();
  rightChild = node.getRightChild();

  if(node.getLeftChild() == null && node.getRightChild() == null)
   {
     result = null;
   }

   else if(node.getLeftChild() == null && node.getRightChild() != null)
   {
     result = node.getRightChild();
   }

   else if(node.getLeftChild() != null && node.getRightChild() == null)
   {
     result = node.getLeftChild();
   }

   else
   {
     result = findInorderSucessor(rightChild);
     result.setLeftChild(leftChild);
     result.setRightChild(rightChild);
   }

   return result;

}

 //findInorderSucessor
 private BinaryTreeNode<T> findInorderSucessor(BinaryTreeNode<T> node)
 {
   BinaryTreeNode<T> child = node.getLeftChild();

  if(child == node)
  {
     return node;
  }
  else if(child.getLeftChild() == null)
  {
     child.setRightChild(node.getLeftChild());
  }

  return findInorderSucessor(child);
 }

 public ArrayList<T> inOrderIterator()
 {
  ArrayList<T> myArr = new ArrayList<T>();
  BinaryTreeNode<T> currentNode = this.root;
  if(currentNode != null)
  {
     inOrderIterator(currentNode.getLeftChild());
     myArr.add(currentNode.getElement());
     inOrderIterator(currentNode.getRightChild());
  }

  return myArr;
 }


}

1 个答案:

答案 0 :(得分:3)

查看您的方法声明:

public ArrayList<T> inOrderIterator()

它没有任何参数。但看看你是如何尝试调用它的:

inOrderIterator(currentNode.getRightChild());

...你正在指定一个参数。没有适用于该电话的方法。

我怀疑你想要重载方法,让私有方法接受一个节点和一个List<T>(你正在构建的那个),然后让你的公共方法调用它。例如:

public List<T> inOrderIterator() {
    List<T> list = new ArrayList<T>();
    inOrderIterator(list, this.root);
    return list;
}

private void inOrderIterator(List<T> list, BinaryTreeNode<T> current) {
    if (current == null) {
        return;
    }
    inOrderIterator(current.getLeftChild());
    list.add(current);
    inOrderIterator(current.getRightChild());  
}