Skip to content

Commit 48d8bd1

Browse files
author
lucifer
committed
feat: 线段树
1 parent d891134 commit 48d8bd1

File tree

3 files changed

+129
-6
lines changed

3 files changed

+129
-6
lines changed

src/App.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,15 @@ function App() {
149149
<Tabs>
150150
{tempaltes.map((tempalte) => (
151151
<TabPane tab={tempalte.title} key={tempalte.title}>
152-
建议先学会之后再用模板。 如果你还不会的话,可以看看我的
153-
<Button type="link" href={tempalte.link} target="_blank">
154-
文章
155-
</Button>
156-
哦~
152+
{tempalte.link && (
153+
<div>
154+
建议先学会之后再用模板。 如果你还不会的话,可以看看我的
155+
<Button type="link" href={tempalte.link} target="_blank">
156+
文章
157+
</Button>
158+
哦~
159+
</div>
160+
)}
157161
{tempalte.list.map(({ text, problems, codes }) => (
158162
<Collapse>
159163
<Panel header={<div>{text}</div>} key={text}>

src/codeTemplates/index.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@ import uf from "./uf";
44
import bfs from "./bfs";
55
import trie from "./trie";
66
import slidingWindow from "./sliding-window";
7+
import segmemntTree from "./segmentTree";
78
// import heap from "./heap";
89
// bfs , sliding window, trie, uf
9-
export default [binarySearch, bfs, slidingWindow, backtrack, trie, uf];
10+
export default [
11+
binarySearch,
12+
bfs,
13+
slidingWindow,
14+
backtrack,
15+
trie,
16+
uf,
17+
segmemntTree,
18+
];

src/codeTemplates/segmentTree.js

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
const pyCode = `
2+
class SegmentTree:
3+
def __init__(self, data:List[int]):
4+
'''
5+
data:传入的数组
6+
'''
7+
self.data = data
8+
self.n = len(data)
9+
# 申请4倍data长度的空间来存线段树节点
10+
self.tree = [None] * (4 * self.n) # 索引i的左孩子索引为2i+1,右孩子为2i+2
11+
if self.n:
12+
self.build(0, 0, self.n-1)
13+
# 本质就是一个自底向上的更新过程
14+
# 因此可以使用后序遍历,即在函数返回的时候更新父节点。
15+
def update(self, tree_index, l, r, index):
16+
'''
17+
tree_index:某个根节点索引
18+
l, r : 此根节点代表区间的左右边界
19+
index : 更新的值的索引
20+
'''
21+
if l == r==index :
22+
self.tree[tree_index] = self.data[index]
23+
return
24+
mid = (l+r)//2
25+
left, right = 2 * tree_index + 1, 2 * tree_index + 2
26+
if index > mid:
27+
# 要更新的区间在右子树
28+
self.update(right, mid+1, r, index)
29+
else:
30+
# 要更新的区间在左子树index<=mid
31+
self.update(left, l, mid, index)
32+
# 查询区间一部分在左子树一部分在右子树
33+
# 区间和使用加法即可,如果不是区间和要改下面这行代码
34+
self.tree[tree_index] = self.tree[left] + self.tree[right]
35+
36+
def updateSum(self,index:int,value:int):
37+
self.data[index] = value
38+
self.update(0, 0, self.n-1, index)
39+
def query(self, tree_index:int, l:int, r:int, ql:int, qr:int) -> int:
40+
'''
41+
递归查询区间[ql,..,qr]的值
42+
tree_index : 某个根节点的索引
43+
l, r : 该节点表示的区间的左右边界
44+
ql, qr: 待查询区间的左右边界
45+
'''
46+
if l == ql and r == qr:
47+
return self.tree[tree_index]
48+
49+
# 区间中点,对应左孩子区间结束,右孩子区间开头
50+
mid = (l+r) // 2
51+
left, right = tree_index * 2 + 1, tree_index * 2 + 2
52+
if qr <= mid:
53+
# 查询区间全在左子树
54+
return self.query(left, l, mid, ql, qr)
55+
elif ql > mid:
56+
# 查询区间全在右子树
57+
return self.query(right, mid+1, r, ql, qr)
58+
59+
# 查询区间一部分在左子树一部分在右子树
60+
# 区间和使用加法即可,如果不是区间和要改下面这行代码
61+
return self.query(left, l, mid, ql, mid) + self.query(right, mid+1, r, mid+1, qr)
62+
63+
def querySum(self, ql:int, qr:int) -> int:
64+
'''
65+
返回区间[ql,..,qr]的和
66+
'''
67+
return self.query(0, 0, self.n-1, ql, qr)
68+
69+
def build(self, tree_index:int, l:int, r:int):
70+
'''
71+
递归创建线段树
72+
tree_index : 线段树节点在数组中位置
73+
l, r : 该节点表示的区间的左,右边界
74+
'''
75+
if l == r:
76+
self.tree[tree_index] = self.data[l]
77+
return
78+
mid = (l+r) // 2 # 区间中点,对应左孩子区间结束,右孩子区间开头
79+
left, right = 2 * tree_index + 1, 2 * tree_index + 2 # tree_index的左右子树索引
80+
self.build(left, l, mid)
81+
self.build(right, mid+1, r)
82+
# 区间和使用加法即可,如果不是区间和要改下面这行代码
83+
self.tree[tree_index] = self.tree[left] + self.tree[right]
84+
`;
85+
86+
module.exports = {
87+
title: "线段树",
88+
list: [
89+
{
90+
text: "区间和线段树",
91+
problems: [
92+
{
93+
id: "range-sum-query-immutable",
94+
title: "303. 区域和检索 - 数组不可变(使用一维前缀和会更简单)",
95+
},
96+
{
97+
id: "range-sum-query-mutable",
98+
title: "307. 区域和检索 - 数组可修改",
99+
},
100+
],
101+
codes: [
102+
{
103+
language: "py",
104+
text: pyCode,
105+
},
106+
],
107+
},
108+
],
109+
link: "",
110+
};

0 commit comments

Comments
 (0)