优化二叉树会产生奇怪的重复错误

时间:2013-09-10 04:33:51

标签: c pointers binary-tree

我正在尝试实现一个应该使二叉树完整的 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]);
        }
    }
}

在此代码中,bintreestruct { node *root; int size; },所有其他方法都可以正常工作。

完整代码也是on GitHub,但此bt_optimize方法仅在optimize分支中。

这是C,而不是C ++。

有什么建议吗?

2 个答案:

答案 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