题目:
给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。
(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)
来源:力扣(LeetCode)
class Solution {
public int maxAncestorDiff(TreeNode root) {
return dfs(root, root.val, root.val);
}
public int dfs(TreeNode root, int mi, int ma) {
if (root == null) {
return 0;
}
int diff = Math.max(Math.abs(root.val - mi), Math.abs(root.val - ma));
mi = Math.min(mi, root.val);
ma = Math.max(ma, root.val);
diff = Math.max(diff, dfs(root.left, mi, ma));
diff = Math.max(diff, dfs(root.right, mi, ma));
return diff;
}
}
主要思路:深度优先搜索(递归)
有关树的问题都可以优先考虑递归算法,以局部反映整体。
这个题的关键是每个节点都有可能与另一个节点构成满足题意的关系,这就需要我们把每个节点与它的子节点的差值、父节点以及得到的值都遍历比较一遍。
而满足题意的值diff可以通过val和最大最小值作差的绝对值取得。
因此,可以用深度优先搜索算法,不断和子节点的diff值比价来优化,得到结果。