关于线段树的非递归实现

来源:9-6 线段树中的更新操作

iQiuQiuX

2018-11-28

你好,波波老师,关于线段树章节中 leetcode 中的第 307 题 Range Sum Query - Mutable;
使用课程中讲到的线段树能通过,但用时将近 100ms ,排名超过 50% ;
看了下耗时比较短的,与使用 sum 数组的方式类似,使用非递归的树形实现;
请问这样的树是如何构建的,i += (i & -i) 也不是很明白。

代码如下:

public class NumArray {
    // 线段树一类题目
    private int[] tree,nums;
    // m是数组的长度
    private int m;

    public NumArray(int[] nums) {
        m = nums.length;
        this.nums = nums;
        //m+1是为了便于计算数sum 0
        tree = new int[m + 1];

        for(int i = 0; i < m; i++) {
            updateTree(i + 1, nums[i]);
        }
    }

    //这里是往上面加一些值
    public void updateTree(int idx,int val){
        for(int i = idx; i <= m; i += (i & -i)) {
            tree[i] += val;
        }
    }

    public void update(int i, int val) {
        int d = val - nums[i];
        nums[i] = val;
        updateTree(i + 1,d);
    }

    public int sum(int idx){
        int sum = 0;
        for(int i = idx; i > 0; i -= (i & -i)){
            sum += tree[i];
        }
        return sum;
    }

    public int sumRange(int i, int j) {
        return sum(j + 1) - sum(i);
    }
}
写回答

1回答

liuyubobobo

2018-11-28

这个代码是使用树状数组实现的(英文,Binary Indexed Tree 或者 Fenwick Tree)。树状数组不是这个课程的内容,有兴趣可以在网上查找相关资料进行自学。


加油!:)

0
1
iQiuQiuX
好的 谢谢~
2018-11-28
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程