线段树 05 在线段树中更新单个元素

在线段树中更新单个元素

  • 在线段树中更新一个元素的过程分2步:
    • 在data中更新;
    • 由于data的更新导致在tree上也要更新;
// 将index位置的值,更新为e
public void set(int index, E e){

    if(index < 0 || index >= data.length)
        throw new IllegalArgumentException("Index is illegal");

    data[index] = e;
    set(0, 0, data.length - 1, index, e);
}
  • 在tree中做协变的更新是个递归问题:在treeIndex为根的线段树中更新index的值为e;
  • 规模更小的同一个问题是:在treeIndex的左右子树中更新index的值为e;
    • 当index <= mid时:在treeIndex的左子树中更新index的值为e;
    • 当index >= mid + 1时:在treeIndex的右子树中更新index的值为e;
    • treeIndex的左右子树都更新完成之后,重新合并treeIndex的左右孩子的值,赋予tree[treeIndex];
  • 不能再缩小的基本问题是:treeIndex已经是叶子节点了,其只代表了data中的一个元素,即 l == r,就在tree中把tree[treeIndex]更新为e;
// 在以treeIndex为根的线段树中更新index的值为e
private void set(int treeIndex, int l, int r, int index, E e){

    if(l == r){
        tree[treeIndex] = e;
        return;
    }

    int mid = l + (r - l) / 2;
    // treeIndex的节点分为[l...mid]和[mid+1...r]两部分
    int leftTreeIndex = leftChild(treeIndex);
    int rightTreeIndex = rightChild(treeIndex);
    if(index >= mid + 1)
        set(rightTreeIndex, mid + 1, r, index, e);
    else // index <= mid
        set(leftTreeIndex, l, mid, index, e);

    tree[treeIndex] = merger.merge(tree[leftTreeIndex], tree[rightTreeIndex]);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 10,794评论 0 9
  • 线段树定义: 线段树是一种二叉搜索树,又叫区间树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个...
    habit_learning阅读 4,494评论 0 0
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 14,584评论 0 25
  • 数据结构与算法-线段树 图片来自慕课网,liuyubobobo讲师的课程“玩转数据结构 从入门到进阶” 线段树介绍...
    sunhaiyu阅读 3,848评论 0 1
  • 德国风情小镇,常德城区又一特色休闲场所,离常德河街不远,同属穿紫河商业经济圈。建筑基本上按照德国下萨克森州首府、北...
    吾心雨阅读 8,863评论 0 2