Segment Tree 总结

为什么要学习线段树?
这是一个advanced知识点,二线公司一般不会问。
如果你想去面一线公司,特别是谷歌是明确要求这个知识点的。我有认识人电面确实被问到。有人被要求用线段树写range query, 有人被要求用线段树写count smaller number after itself.

Range Query Immutable

  1. balanced binary tree
  2. Left + right -> root; root.min = Math.min(left.min, right.min); root.sum = left.sum + right.sum
  3. Leaf : start == end

class SegmentTreeNode {
int start, end;
SegmentTreeNode left, right;
int sum;
}
通过mid = start + (end - start) / 2 来确定往左走还是往右走还是两边都要走。

无非就是三个操作 (其实还有delete, 不常用)
1。建树
2。Query
3 update

什么时候用: Interval/Range, min/max/sum/count
有时用index, 有时用value来build tree

高级知识点:

  1. Range compression
  2. Lazy propagation (引用文献 https://leetcode.com/problems/my-calendar-ii/discuss/109528/nlogd-Java-solution-using-segment-tree-with-lazy-propagation-applicable-to-the-general-case-of-K-booking)

你可能感兴趣的:(Segment Tree 总结)