我正在尝试实现一个应该使二叉树完整的 optimize 方法。我的方法通过将树排序为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
是struct { node *root; int size; }
,所有其他方法都可以正常工作。
完整代码也是on GitHub,但此bt_optimize
方法仅在optimize
分支中。
这是C,而不是C ++。
有什么建议吗?
答案 0 :(得分:1)
似乎当min = max - 1时,“out [(* i)++]语句运行两次。
if (len == 1) {
// just add it
out[(*i)++] = in[min];
// -- Should place a "return;" here?
} // else
// Add the midpoint
int midpos = min + ((max - min) >> 1);
out[(*i)++] = in[midpos];
答案 1 :(得分:0)
这段代码对我来说很可疑:
out[(*i)++]
原因是这样它会将“i”的值作为索引,然后它将增加该值。
为了证明我进行了测试。例如:
int index,value;
index = 10;
value = index++;//this way value will become 10 and index 11
index = 10;
value = ++index;//this way both become 11