【问题标题】:inOrderIterator method cannot be applied to BinaryTreeNode<T>inOrderIterator 方法不能应用于 BinaryTreeNode<T>
【发布时间】:2013-12-28 10:15:50
【问题描述】:

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


}

【问题讨论】:

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


    【解决方案1】:

    看看你的方法声明:

    public ArrayList<T> inOrderIterator()
    

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

    inOrderIterator(currentNode.getRightChild());
    

    ...您正在指定一个参数。没有适用于该调用的方法。

    我怀疑您想重载该方法以使私有方法接受一个节点和一个List&lt;T&gt;(您正在构建的那个),然后让您的公共方法调用它。例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 2011-08-14
      • 2018-07-18
      • 1970-01-01
      相关资源
      最近更新 更多