MCPcopy Create free account
hub / github.com/acm-clan/algorithm-stone / NumArray

Class NumArray

templates/segment-tree.cpp:8–108  ·  view source on GitHub ↗

@lc code=start

Source from the content-addressed store, hash-verified

6
7// @lc code=start
8class NumArray {
9public:
10 struct TreeNode{
11 int l, r, v;
12 TreeNode * left = nullptr;
13 TreeNode * right = nullptr;
14 TreeNode(int l, int r, int v):l(l), r(r), v(v){
15
16 }
17 TreeNode(int l, int r, int v, TreeNode * left, TreeNode * right):l(l), r(r), v(v),
18 left(left), right(right)
19 {
20
21 }
22 };
23
24 TreeNode * root;
25
26 TreeNode * buildTree(vector<int>& nums, int l, int r)
27 {
28 if(l == r){
29 // 叶子节点
30 return new TreeNode(l, r, nums[l]);
31 }
32
33 // 后序构造
34 auto left = buildTree(nums, l, (l+r)/2);
35 auto right = buildTree(nums, (l+r)/2+1, r);
36
37 // 非叶子节点
38 return new TreeNode(l, r, left->v+right->v, left, right);
39 }
40
41 void dumpInternal(TreeNode * n, int d){
42 if(!n)return;
43 for(int i=0; i<d; i++)printf("--");
44 printf("%d(%d %d)\n", n->v, n->l, n->r);
45 dumpInternal(n->left, d+1);
46 dumpInternal(n->right, d+1);
47 }
48
49 void updateNode(TreeNode * n, int pos, int val){
50 if(!n)return;
51
52 if(n->l == n->r && n->l == pos){
53 n->v = val;
54 return;
55 }
56
57 int m = (n->l+n->r)/2;
58
59 // 后序遍历
60 if(pos <= m){
61 updateNode(n->left, pos, val);
62 }else{
63 updateNode(n->right, pos, val);
64 }
65 n->v = n->left->v + n->right->v;

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected