题目
思路
记录当前路径的最大值和最小值,到叶节点时则可得到,当前路径的最大差值。
两种思路:
1、自顶向下(递):
从上到下,先序遍历的方式,同时维护上面结点的最大值和最小值。当前路径的最大值和最小值通过参数传递。
2、自底向上(归)
当前路径的最大值和最小值,通过函数返回值,从下往上传递。
- 对于自底向上(归)的方法有个细节,curMin和curMax得到的是以当前节点为根节点的子树的最大值和最小值,由于最大值和最小值可能来自一个来自左节点,一个来自右节点,所以应该用当前节点的值分别与这两最值作差,取其中最大的作为一条路径的最大差值。
- 而对于自顶向下的方法,由于是已经访问过的路径的最大值,最小值,他们处于同一路径,无需关心来自不同路径了,所以可以直接取curMax-curMin
代码(25 11.28首刷)
//方法一:自顶向下(递):
class Solution {
public:
//记录当前路径的最大值和最小值
int maxDiff = INT_MIN;
void dfs(TreeNode* root, int curMin, int curMax){
if(!root) return ;
curMin = min(root->val, curMin);
curMax = max(root->val, curMax);
maxDiff = max(curMax - curMin, maxDiff);
dfs(root->left, curMin, curMax);
dfs(root->right, curMin, curMax);
}
int maxAncestorDiff(TreeNode* root) {
dfs(root, INT_MAX, INT_MIN);
return maxDiff;
}
};
// 方法二:自底向上
class Solution {
public:
//得到以当前节点为根节点的子树的最大值和最小值,由于最大值和最小值可能来自一个来自左节点,一个来自右节点,所以应该用当前节点的值分别与这两作差得到一条路径的最大差值。
int maxDiff = INT_MIN;
pair<int, int> dfs(TreeNode* root){
if(!root) return {INT_MAX, INT_MIN};
auto [l_mn, l_mx] = dfs(root->left);
auto [r_mn, r_mx] = dfs(root->right);
int curMin = min(root->val, min(l_mn, r_mn));
int curMax = max(root->val, max(l_mx, r_mx));
maxDiff = max(maxDiff, max(root->val - curMin, curMax - root->val));
return {curMin, curMax};
}
int maxAncestorDiff(TreeNode* root) {
dfs(root);
return maxDiff;
}
};



299

被折叠的 条评论
为什么被折叠?



