这里以动态开点线段树的建树过程为例
约定(全局变量):
rt: 根节点编号
tot: 元素个数
ch[x][0]: x的左儿子
ch[x][1]: x的右儿子
形式一:
int buildTree(int l, int r) {
int cur = ++tot;
if (l == r) return cur;
int mid = l + (r - l >> 1);
ch[cur][0] = buildTree(l, mid);
ch[cur][1] = buildTree(mid + 1, r);
return cur;
}
调用:
rt = buildTree(1, n);
形式二:
void buildTree(int& cur, int l, int r) {
cur = ++tot;
if (l == r) return;
int mid = l + (r - l >> 1);
buildTree(ch[cur][0], l, mid);
buildTree(ch[cur][1], mid + 1, r);
return;
}
调用:
buildTree(rt, 1, n);
形式三:
void buildTree(int cur, int l, int r) {
if (l == r) return;
int mid = l + (r - l >> 1);
buildTree(ch[cur][0] = ++tot, l, mid);
buildTree(ch[cur][1] = ++tot, mid + 1,
return;
}
调用:
buildTree(rt = ++tot, 1, n);
其中,形式三是我个人最喜欢的,但是我见得最多的代码还是形式一和二。形式一和二在逻辑上明显要更绕,但如此常见,以至于我怀疑是否这两种写法具有更明确的含义或更通畅的思维过程?有dalao能解释吗QwQ。