用c ++构建段树

时间:2017-06-18 07:37:54

标签: c++ recursion segment-tree

我正在尝试用c ++构建一个分段树。遵循相同的递归函数:

int buildTree(int node,int start,int end,int tree[])
{
        // printf("Node is: %d\n",node);
    printf("start: %d\tend:%d\tnode:%d\t\n",start,end,node);
    if ( start == end )
    {
        // printf("start: %d,node: %d,array[start] : %d\n",start,node,array[start] );
        tree[node] = array[start];  
        return array[start];

    }
    else
    {
        int mid = ( start + end ) / 2;

        buildTree(2 * node ,mid  + 1,end,tree);
        buildTree(2 * node + 1,start,mid,tree);

        tree[node] = tree[ 2 * node ] + tree[ 2 * node + 1 ];
        return tree[node];
    }
}

数组是全局定义的:

int array[] = {1,2,3,4,5};

跟随电话后的树:

int main(int argc, char const *argv[])
{
    int tree[100];
    buildTree(0,0,4,tree);
    for (int i = 0; i < 9; ++i)
    {
        printf("%d : %d\n",i, tree[i]);
    }
    return 0;
}

给出输出:

start: 0    end:4   node:0  
start: 3    end:4   node:0  
start: 4    end:4   node:0  
start: 3    end:3   node:1  
start: 0    end:2   node:1  
start: 2    end:2   node:2  
start: 0    end:1   node:3  
start: 1    end:1   node:6  
start: 0    end:0   node:7  
0 : 15
1 : 6
2 : 3
3 : 3
4 : 474810352
5 : 32766
6 : 2
7 : 1
8 : 0

因此,永远不会处理节点4和5。我哪里做错了?我想我很难接受递归。

1 个答案:

答案 0 :(得分:0)

我使用不同的方式构建了一个分段树。

您应该使用initial node = 1调用函数buildTree。

buildTree(1,0,4,tree);

这应该可以解决错误。

此外,大多数段树实现代码使用节点(2 *节点)作为范围(start - &gt; mid),节点(2 * node + 1)作为范围(mid + 1 - &gt; end) )。

我认为这是一个惯例问题。但是遵守惯例会使您更容易调试代码,并且更容易让其他程序员理解它。

因此您可以将递归调用重写为:

buildTree(2 * node ,start,mid,tree);
buildTree(2 * node + 1,mid+1,end,tree);

而不是:

buildTree(2 * node ,mid  + 1,end,tree);
buildTree(2 * node + 1,start,mid,tree);