非常简单的问题:
递归地如何创建使用此构造函数的二进制搜索树(按顺序)的数组:
public class OrderedSet<E extends Comparable<E>> {
private class TreeNode {
private E data;
private TreeNode left, right;
public TreeNode(E el) {
data = el;
left = null;
right = null;
}
}
private TreeNode root;
public int size = 0;
public OrderedSet() {
root = null;
}
答案 0 :(得分:4)
有序意味着您首先必须遍历树的左侧部分,所以:
TreeNode tree // this is your tree you want to traverse
E[] array = new E[tree.size]; // the arrays length must be equivalent to the number of Nodes in the tree
int index = 0; // when adding something to the array we need an index
inOrder(tree, array, index); // thats the call for the method you'll create
方法本身看起来像这样:
public void inOrder(TreeNode node, E[] array, int index){
if(node == null){ // recursion anchor: when the node is null an empty leaf was reached (doesn't matter if it is left or right, just end the method call
return;
}
inOrder(node.getLeft(), array, index); // first do every left child tree
array[index++]= node.getData(); // then write the data in the array
inOrder(node.getRight(), array, index); // do the same with the right child
}
有点像那样。我只是不确定索引和它需要增加的位置。如果您不想担心索引或者您不知道树中有多少个节点,那么请改用ArrayList并将其最终转换为数组。
通常,一个更清晰的调用方法是围绕递归方法构建的,如下所示:
public E[] inOrderSort(TreeNode tree){
E[] array = new E[tree.size];
inOrder(tree, array, 0);
return array;
}
答案 1 :(得分:2)
谢谢,这很有效。 Java不允许我创建一个泛型数组,所以使用你的算法我使它使用ArrayList(就像你建议的)这里的方法(使用上面的构造函数)只是让别人问同样的问题。 (参考是我对当前树节点的引用)
public ArrayList<E> toArray() {
ArrayList<E> result = new ArrayList<E>();
toArrayHelp(root, result);
return result;
}
private void toArrayHelp(TreeNode ref, ArrayList<E> result) {
if (ref == null) {
return;
}
toArrayHelp(ref.left, result);
result.add(ref.data);
toArrayHelp(ref.right, result);
}