有没有办法将二进制转换为有序数组,而不必为每个数组索引遍历树?
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;
}
}
正如您所看到的,如果树中有很多节点,则可能需要很长时间。 顺便说一下,我忘了显示整个树必须在开始时遍历以获得数组的长度。
答案 0 :(得分:14)
是的,你可以这样做:运行树的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
}
请注意,为了使上述递归过程起作用,调用者必须在传递给函数的array
中分配足够的空间。
答案 1 :(得分:4)
您想要的是有序遍历,通常以递归方式实现,如:
答案 2 :(得分:3)