关于树状数据结构的建树过程的代码形式
  • 板块学术版
  • 楼主Skeleton_Huo
  • 当前回复9
  • 已保存回复9
  • 发布时间2022/12/28 19:24
  • 上次更新2023/10/24 06:17:52
查看原帖
关于树状数据结构的建树过程的代码形式
324632
Skeleton_Huo楼主2022/12/28 19:24

这里以动态开点线段树的建树过程为例

约定(全局变量):

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。

2022/12/28 19:24
加载中...