InOrder二叉树与迭代器toString()

时间:2015-01-05 17:00:08

标签: java list binary-tree

我已经编写了所有其他内容,如addChild(),insert()等,但似乎我的toInorderToList()不起作用。它应该将树中的所有元素添加到List中,然后我必须打印出列表,但我总是得到那些错误java.util.ArrayList$Itr@70dea4e

我的代码片段

    private List<BinaryTreeNode> toInorderList(){
    if(this.root == null){
        return new ArrayList<BinaryTreeNode>();
    }else{
        return toInorderList(this.root);
    }


}

private ArrayList<BinaryTreeNode> toInorderList(BinaryTreeNode node) {
    ArrayList<BinaryTreeNode> treelist = new ArrayList<BinaryTreeNode>();
    if(node.left !=null){
        toInorderList(node.left);
        treelist.add(node.left);    
    }
    treelist.add(this.root);
    if(node.right != null){
        toInorderList(node.right);
        treelist.add(node.right);
    }
    return treelist;

}

和toString()以及iterator()

    public Iterator<BinaryTreeNode> iterator() {
    return toInorderList().iterator();
}    

public String toString() {
    return toInorderList().iterator().toString();

}

2 个答案:

答案 0 :(得分:0)

首先,在此代码中:

if(node.left !=null){
    toInorderList(node.left);
    treelist.add(node.left);    
}
treelist.add(this.root);
if(node.right != null){
    toInorderList(node.right);
    treelist.add(node.right);
}

toInorderList函数有返回值,因此您需要使用treelist.addAll(toInorderList(node.left);

另外,为了提高内存效率,我可能会在你的函数外部使用一个ArrayList,并让每个递归调用访问它。

private List<BinaryTreeNode> toInorderList(){
    if(this.root == null){
        return new ArrayList<BinaryTreeNode>();
    }else{
        ArrayList<BinaryTreeNode> treeList = new ArrayList<BinaryTreeNode>();
        toInorderList(this.root, treeList);
        return treeList;
    }
}

private toInorderList(BinaryTreeNode node, ArrayList<BinaryTreeNode> treelist) {
    if(node.left !=null){
        toInorderList(node.left, treeList));
        treelist.add(node.left);    
    }
    treelist.add(this.root);
    if(node.right != null){
        toInorderList(node.right, treeList));
        treelist.add(node.right);
    }
}

答案 1 :(得分:0)

这是树的顺序遍历

  private void InOrder(AVLNode<T> T)
  {
        if(T == null){
           return;
        } 
        InOrder(T.left);
        System.out.print(T.item + ", ");
        InOrder(T.right);        
 }

创建一个重载并简单地用arraylist add

替换系统
  private void InOrder(AVLNode<T> T, ArrayList list)
  {
        if(T == null){
           return;
        } 
        InOrder(T.left, list);
        list.add(T.item);            
        InOrder(T.right, list);        
  }

我花了两分钟修改我的avl树来接受这个。 root是树的头部,主树的实例化。我内心有一系列的整数

ArrayList<Integer> list = new ArrayList<>; 

是我的列表实例化。

root.InOrder(root);

root.InOrder(root, list);

工作得很好