java – 将二进制树转换为已排序的数组

有没有办法将二进制转换为排序数组而不必遍历每个数组索引的树?

Node root;
Node runner;
int current_smallest;

void findsmallest(Node root){
    //Pre-order traversal
    if(root == null){
        return;
    }else{
        runner = root;
        if(current_smallest == null){
            current_smallest = runner.element;
        }else{
            if(current_smallest > runner.element){
            current_smallest = runner.element;
            }
        }
        findsmallest(runner.left);
        findsmallest(runner.right);
    }   
}

void fill_array( int [] array ){

    for(int i =0; i < array.length(); i++){
        findsmallest(root);
        array[i] = current_smallest;
    }
} 

如您所见,如果树中有很多节点,则可能需要很长时间.
顺便说一句,我忘了显示整个树必须在开始时遍历以获得数组的长度.

最佳答案
是的,你可以这样做:运行树的in-order traversal,保持数组的当前位置,并将节点的值存储在数组的当前位置.

您可以递归地进行有序遍历,也可以使用堆栈数据结构进行遍历遍历.如果您想以递归方式执行此操作,则可以执行以下操作:

int fill_array(Node root, int [] array, int pos) {
    if (root.left != null) {
        pos = fill_array(root.left, array, pos);
    }
    array[pos++] = root.element;
    if (root.right != null) {
        pos = fill_array(root.right, array, pos);
    }
    return pos; // return the last position filled in by this invocation
}

请注意,为了使上述递归过程起作用,调用者必须在传递给函数的数组中分配足够的空间.

转载注明原文:java – 将二进制树转换为已排序的数组 - 代码日志