fixed tree_prune and level_order_it
This commit is contained in:
parent
156c3b3959
commit
99df8ad38d
11
vectree.c
11
vectree.c
@ -24,7 +24,7 @@ int ug_tree_init(UgTree *tree, unsigned int size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ordered refs are used in the iterators
|
// ordered refs are used in the iterators
|
||||||
tree->ordered_refs = malloc(sizeof(int) * size);
|
tree->ordered_refs = malloc(sizeof(int) * (size + 1));
|
||||||
if (tree->ordered_refs == NULL) {
|
if (tree->ordered_refs == NULL) {
|
||||||
free(tree->vector);
|
free(tree->vector);
|
||||||
free(tree->refs);
|
free(tree->refs);
|
||||||
@ -128,7 +128,7 @@ int ug_tree_resize(UgTree *tree, unsigned int newsize)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int *neworrefs = realloc(tree->ordered_refs, newsize * sizeof(int));
|
int *neworrefs = realloc(tree->ordered_refs, (newsize + 1)* sizeof(int));
|
||||||
if (neworrefs == NULL) {
|
if (neworrefs == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -209,9 +209,10 @@ int ug_tree_prune(UgTree *tree, int ref)
|
|||||||
|
|
||||||
tree->vector[ref] = 0;
|
tree->vector[ref] = 0;
|
||||||
tree->refs[ref] = -1;
|
tree->refs[ref] = -1;
|
||||||
|
tree->elements--;
|
||||||
|
|
||||||
int count = 1;
|
int count = 1;
|
||||||
for (int i = 0; i < tree->size; i++) {
|
for (int i = 0; tree->elements > 0 && i < tree->size; i++) {
|
||||||
if (tree->refs[i] == ref) {
|
if (tree->refs[i] == ref) {
|
||||||
count += ug_tree_prune(tree, i);
|
count += ug_tree_prune(tree, i);
|
||||||
}
|
}
|
||||||
@ -295,7 +296,7 @@ int ug_tree_level_order_it(UgTree *tree, int ref, int *cursor)
|
|||||||
|
|
||||||
// TODO: this could also be done when adding or removing elements
|
// TODO: this could also be done when adding or removing elements
|
||||||
// first call, create a ref array ordered like we desire
|
// first call, create a ref array ordered like we desire
|
||||||
if (queue == NULL) {
|
if (*cursor == -1) {
|
||||||
*cursor = 0;
|
*cursor = 0;
|
||||||
for (int i = 0; i < tree->size; i++) {
|
for (int i = 0; i < tree->size; i++) {
|
||||||
queue[i] = -1;
|
queue[i] = -1;
|
||||||
@ -317,6 +318,8 @@ int ug_tree_level_order_it(UgTree *tree, int ref, int *cursor)
|
|||||||
ref = queue[off];
|
ref = queue[off];
|
||||||
|
|
||||||
} while (IS_VALID_REF(tree, ref));
|
} while (IS_VALID_REF(tree, ref));
|
||||||
|
// This line is why tree->ordered_refs has to be size+1
|
||||||
|
queue[off+1] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// PRINT_ARR(queue, tree->size);
|
// PRINT_ARR(queue, tree->size);
|
||||||
|
Loading…
Reference in New Issue
Block a user