@lc code=start
| 6 | |
| 7 | // @lc code=start |
| 8 | class NumArray { |
| 9 | public: |
| 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; |
nothing calls this directly
no outgoing calls
no test coverage detected