标签:说明 元素 数据 new 包含 header 分治 array range
之前一直听说线段树是一个很高级很难的数据结构,今天简单了解了下, 感觉就是二叉树加几个全局变量啊,原来这么easy?(开个玩笑)
简单说几个特点,
1. 每个节点除了存放left,right指针之外,还存着一个范围(这个范围一般是构建线段树之前数组的索引范围), 就是以当前节点为根的情况下,对自己下面所有节点的求交集, 还可以根据你的需求 加一些别的特殊字段,sum,max,min等等
2. 数据集都存在叶子节点上,非叶子节点只做归纳总结
一般还有几个操作
1. 初始化,就是把一个数组初始化成一个线段树(关键是修改你需求中的特殊字段 sum等)
2. 修改某一个索引处的数值,同时保证他的祖先节点的特殊字段是对的
3. 求某一个索引范围内的信息
整体思路是分治,递归求解。
leetcode 307 是一个典型的线段树
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。
示例:
Given nums = [1, 3, 5] sumRange(0, 2) -> 9 update(1, 2) sumRange(0, 2) -> 8
说明:
class NumArray { class SegmentTree { int start; int end; int sum; SegmentTree left; SegmentTree right; SegmentTree(int s, int e, int sum_temp, SegmentTree l, SegmentTree r) { start = s; end = e; sum = sum_temp; left = l; right = r; } } int[] n; SegmentTree head; public NumArray(int[] nums) { n = nums; head = init(nums, 0, nums.length - 1); } SegmentTree init (int[] nums, int start, int end) { if (start > end) return null; if (start == end) { return new SegmentTree(start, end, nums[start], null, null); } int mid = (start + end)/2; SegmentTree left = init(nums, start, mid); SegmentTree right = init(nums, mid + 1, end); return new SegmentTree(start, end, left.sum + right.sum, left, right); } public void update(int i, int val) { runUpdate(head, i, val); } void runUpdate(SegmentTree root, int i, int val) { if (root.start == root.end) { root.sum = val; return; } int mid = (root.start + root.end)/2; if (i <= mid) { runUpdate(root.left, i, val); } else { runUpdate(root.right, i, val); } root.sum = root.left.sum + root.right.sum; } public int sumRange(int i, int j) { return runSumRange(head, i, j); } int runSumRange(SegmentTree root, int i, int j) { if (root.start == i&&root.end == j) { return root.sum; } int mid = (root.start + root.end)/2; if (j <= mid) { return runSumRange(root.left, i, j); } if (i > mid) { return runSumRange(root.right, i, j); } return runSumRange(root.left, i, mid) + runSumRange(root.right, mid + 1, j); } }
标签:说明 元素 数据 new 包含 header 分治 array range
原文地址:https://www.cnblogs.com/tobemaster/p/10474420.html