如何在java中的二进制搜索树中执行toArray方法?

时间:2017-05-25 02:28:59

标签: java binary-search-tree

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

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

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

我知道我需要做什么,但我不知道如何编码。我可以递归地来到树的左边和右边。之后我需要创建一个更大的数组并将项目复制到其中,然后返回新的更大的数组。还必须有一个没有孩子的终止条件,如果我必须制作一个长度为1的数组,然后将值放入其中。

1 个答案:

答案 0 :(得分:0)

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

     5
   /   \
  2     7
 / \   / \
1   3 6   8

下面的方法将向左移动,添加1,然后235,然后是树的右侧。为了使这种方法有意义,它假定树已经排序。如果树没有排序,那么它对于搜索来说不是很有用。

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