0

使用InOrderIterator遍历方法。我明白如何递归执行此操作,但我一直在收到此编译器错误。inOrderIterator方法不能应用于BinaryTreeNode <T>

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; 
} 


} 

回答

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()); 
} 
相关问题