我需要编写一个方法toArray,它将二叉搜索树的项放入数组中。数组必须按升序排列。现在,我正在处理树节点,稍后将其添加到BSTree中。
public class TreeNode
{
Number value;
TreeNode left;
TreeNode right;
public TreeNode(Number value)
{
this.value=value;
}
public Number[] toArray()
{
//???
}
}
我知道我需要做什么,但我不知道如何编码。我可以递归地来到树的左边和右边。之后我需要创建一个更大的数组并将项目复制到其中,然后返回新的更大的数组。还必须有一个没有孩子的终止条件,如果我必须制作一个长度为1的数组,然后将值放入其中。
答案 0 :(得分:0)
一种方法是使用递归来构建数组。正如@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;
}