我正在尝试用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。我哪里做错了?我想我很难接受递归。
答案 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);