如何在java的二叉搜索树中使用toArray方法?

如何在java的二叉搜索树中使用toArray方法?,java,binary-search-tree,Java,Binary Search Tree,我需要编写一个方法toArray,将二叉搜索树的项放入数组中。数组必须按升序排列。现在,我正在处理树节点,稍后会将其添加到BSTree中 public class TreeNode { Number value; TreeNode left; TreeNode right; public TreeNode(Number value) { this.value=value; } public Number[] toArr

我需要编写一个方法toArray,将二叉搜索树的项放入数组中。数组必须按升序排列。现在,我正在处理树节点,稍后会将其添加到BSTree中

public class TreeNode
{
    Number value; 
    TreeNode left; 
    TreeNode right;

    public TreeNode(Number value)
    {
        this.value=value;
    }
    public Number[] toArray()
    {
        //???
    }
}

我知道我需要做什么,但我不知道如何编码。我可以递归地排列树的左侧和右侧。之后,我需要创建一个更大的数组,并将项目复制到其中,然后返回新的、更大的数组。还必须有一个没有子元素的终止条件,在这种情况下,我必须创建一个长度为1的数组,然后将值放入其中。

一种方法是使用递归来构建数组。正如@Dawood所评论的,首先将已排序的数字从树中添加到
ArrayList
,然后再将其转换为正式数组会更容易。递归中的基本逻辑是,对于每个节点,我们首先将左侧的所有数字相加,然后将节点的特定值相加,然后将右侧的所有数字相加。如果我们考虑下面的二叉树,这是有意义的:

     5
   /   \
  2     7
 / \   / \
1   3 6   8
下面的方法将遍历左侧,添加
1
,然后添加
2
3
5
,然后是树的右侧。为了使这种方法有意义,它假设树已排序。如果没有对树进行排序,那么它对搜索就没有多大用处

public void add(TreeNode node, List<Number> list) {
    if (node == null) {
        return;
    }

    add(node.getLeft(), list);
    list.add(node.getValue());
    add(node.getRight(), list);

    return;
}

public Number[] toArray(TreeNode head) {
    List<Number> list = new ArrayList<>();
    add(head, list);

    Number[] array = new Number[list.size()];
    for (int i=0; i < list.size(); ++i) {
        array[i] = list.get(i);
    }

    return array;
}
public void add(树节点,列表){
if(node==null){
返回;
}
添加(node.getLeft(),list);
添加(node.getValue());
添加(node.getRight(),list);
返回;
}
公众号[]toArray(TreeNode head){
列表=新的ArrayList();
添加(标题、列表);
Number[]数组=新编号[list.size()];
对于(int i=0;i
最初构建一个
数组列表
,因为它们更容易连接。最后一步是对数组进行转换。这个问题最好通过递归来解决。1) 添加
左侧的元素
,2)添加
,3)将
right
的元素添加到生成的
ArrayList
@DawoodibnKareem请参见我对以下解决方案的评论,了解为什么使用ArrayList@ControlAltDel欢迎您发布替代解决方案。您可以使用
列表
界面的
toArray
方法作为最后一步从ArrayList到数字[]的对话无论如何都会使这两次通过。因此,最好创建一个size()方法来计算值的数量,如果这是一个愚蠢的问题,那么使用该方法来初始化arraySorry的大小,但是我可以将列表更改为什么,因为它无法编译。@JasoneScartes发布您收到的错误消息。我还没有测试过这段代码,但我相信它(几乎)是正确的。