如下图中,最底层叶子节点总是靠右的,而代码跑出来的结果却总是靠左。
以节点A[5…9]为例,mid = 7,从代码来看,左分支节点应该为A[5…7],右分支节点应该为A[8…9];
同时,我们不可以把代码改为buildSegmentTree(leftTreeIndex, l, mid - 1);
因为mid是可能为0的;
所以我认为,当节点的区间元素数量为奇数时,左子树应该涵盖更大的区间,而右子树偏少,所以整棵树的最底层叶子节点应该是靠左的。
不知道我想的对不对…
private void buildSegmentTree(int treeIndex, int l, int r){
if(l == r){
tree[treeIndex] = data[l];
return;
}
int leftTreeIndex = leftChild(treeIndex);
int rightTreeIndex = rightChild(treeIndex);
// int mid = (l + r) / 2;
int mid = l + (r - l) / 2;
buildSegmentTree(leftTreeIndex, l, mid);
buildSegmentTree(rightTreeIndex, mid + 1, r);
tree[treeIndex] = merger.merge(tree[leftTreeIndex], tree[rightTreeIndex]);
}