我正在尝试实现一种应该使二叉树完整的优化方法。我的方法是通过将树排序为int*
,然后将数组的中点添加到新数组并在每一半上递归来实现这一点。
但是,代码实际输出的是在沿左树下降到最大深度后生成重复项:
16 8 4 2 1 0 0 3 3 6 5 5 7 7 12 10 9 9 11 11 14 13 13 15 15 24 20 18 17 17 19 19
我一生都无法弄清楚为什么会发生这种情况。
我的代码:
// bth is "binary tree helper [method]"
void bth_optimizearray(int* in, int* out, int min, int max, int* i) {
// `in' is sorted, `out' should be optimized
// `i' is the current index in `out'
int len /* of subarray */ = max - min;
if (len < 1) {
// empty subarray
return;
}
if (len == 1) {
// just add it
out[(*i)++] = in[min];
} // else
// Add the midpoint
int midpos = min + ((max - min) >> 1);
out[(*i)++] = in[midpos];
bth_optimizearray(in, out, min, midpos, i);
bth_optimizearray(in, out, midpos + 1, max, i);
}
void bt_optimize(bintree *tree) {
int treesize = bt_size(tree);
int *ordered = malloc(treesize * sizeof(int));
{
int i = 0;
void visit(node *n) {
ordered[i++] = n -> key;
}
bt_traverse(tree, INORDER, visit);
}
int *optimized = malloc(treesize * sizeof(int));
{
int *i = malloc(sizeof(int));
(*i) = 0;
bth_optimizearray(ordered, optimized, 0, treesize, i);
}
// Free all nodes (but don't call freetree; that would free the tree too)
void freenode(node *n) {
free(n);
}
bt_traverse(tree, INORDER, freenode);
tree -> root = NULL;
{
int i;
for (i = 0; i < treesize; i++) {
printf("%d ", optimized[i]);
bt_add(tree, optimized[i]);
}
}
}
在这段代码中,bintree
is astruct { node *root; int size; }
和所有其他方法都可以正常工作。
完整的代码也在GitHub 上,但是这个bt_optimize
方法只在optimize
分支中。
这是 C,不是 C++。
有什么建议么?