原题链接:1026. 节点与其祖先之间的最大差值
给定二叉树的根节点 root
,找出存在于 不同 节点 A
和 B
之间的最大值 V
,其中 V = |A.val - B.val|
,且 A
是 B
的祖先。
(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)
官方思路:
深度优先搜索
遍历所有节点,记录最大和最小的祖先节点,那么差值就是当前值和最大最小祖先节点相减绝对值中最大的那个
class Solution {
public:
int dfs(TreeNode *root, int mi, int ma) {
if (root == nullptr) { // 先判断当前根节点是否为空,为空返回0
return 0;
}
int diff = max(abs(root->val - mi), abs(root->val - ma)); // diff就是用来求当前最大差值的,先初始化就是0,随着往子节点走,diff值会不断更新
mi = min(mi, root->val); // 更新最小值
ma = max(ma, root->val); // 更新最大值
diff = max(diff, dfs(root->left, mi, ma)); // 左子树的最大差值更新diff,里面包含的逻辑有diff和dfs的结果进行max选值,
diff = max(diff, dfs(root->right, mi, ma)); // 右子树的最大差值更新diff
return diff;
}
int maxAncestorDiff(TreeNode* root) {
return dfs(root, root->val, root->val); // 调用dfs
}
};