题目描述:
For a Maximum Segment Tree, which each node has an extra value max to store the maximum value in this node's interval.
Implement a modify function with three parameter root, index and value to change the node's value with [start, end] = [index, index] to the new given value. Make sure after this change, every node in segment tree still has the max attribute with the correct value.
We suggest you finish problem Segment Tree Build and Segment Tree Query first.
Have you met this question in a real interview? Yes ExampleFor segment tree:
[1, 4, max=3] / \ [1, 2, max=2] [3, 4, max=3] / \ / \ [1, 1, max=2], [2, 2, max=1], [3, 3, max=0], [4, 4, max=3]if call modify(root, 2, 4), we can get:
[1, 4, max=4] / \ [1, 2, max=4] [3, 4, max=3] / \ / \ [1, 1, max=2], [2, 2, max=4], [3, 3, max=0], [4, 4, max=3]or call modify(root, 4, 0), we can get:
[1, 4, max=2] / \ [1, 2, max=2] [3, 4, max=0] / \ / \ [1, 1, max=2], [2, 2, max=1], [3, 3, max=0], [4, 4, max=0] ChallengeDo it in O(h) time, h is the height of the segment tree.
题目思路:题目要求更改max value,只有子树的max value都改好了,才能知道当前root的max value是个啥。用recursion就可以了。
Mycode(AC = 104ms):
/** * Definition of SegmentTreeNode: * class SegmentTreeNode { * public: * int start, end, max; * SegmentTreeNode *left, *right; * SegmentTreeNode(int start, int end, int max) { * this->start = start; * this->end = end; * this->max = max; * this->left = this->right = NULL; * } * } */ class Solution { public: /** *@param root, index, value: The root of segment tree and *@ change the node's value with [index, index] to the new given value *@return: void */ void modify(SegmentTreeNode *root, int index, int value) { // write your code here if (index < root->start || index > root->end) { return; } else if (root->start == index && root->end == index) { root->max = value; } else if (root->start == root->end) { return; } else { int modified_max = INT_MIN; if (root->left) { modify(root->left, index, value); modified_max = max(modified_max, root->left->max); } if (root->right) { modify(root->right, index, value); modified_max = max(modified_max, root->right->max); } root->max = modified_max; } } };