如何在java的二叉搜索树中使用toArray方法?
我需要编写一个方法toArray,将二叉搜索树的项放入数组中。数组必须按升序排列。现在,我正在处理树节点,稍后会将其添加到BSTree中如何在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
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发布您收到的错误消息。我还没有测试过这段代码,但我相信它(几乎)是正确的。