给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。
(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)
思路:
找到当前节点的子节点中的最大值和最小值,然后做差,差的绝对值最大的值,即为当前节点的子节点的最大差值。每个节点都要计算,因此,可以用一个全局变量max记录差值,遍历每个节点时,更新max值。
为了不重复遍历,先遍历到叶子节点,然后从叶子节点向上遍历。其中递归函数,返回一个长度为2的数组,第一个数表示子节点的最小值,第二个数表示子节点的最大值。
java代码:
class Solution {
//数组左边放最小值,右边放最大值。
int max = 0;
public int maxAncestorDiff(TreeNode root) {
trace(root);
return max;
}
public int[] trace(TreeNode node) {
if(node.left == null && node.right== null) {
return new int[]{node.val, node.val};
}
int[] left = new int[]{node.val, node.val};
int[] right = new int[]{node.val,node.val};
if(node.left != null) {
left = trace(node.left);
}
if(node.right != null) {
right = trace(node.right);
}
int[] res = new int[]{Math.min(left[0], right[0]), Math.max(left[1], right[1])};
max = max < Math.abs(res[0] - node.val) ? Math.abs(res[0] - node.val) : max;
max = max < Math.abs(res[1] - node.val) ? Math.abs(res[1] - node.val) : max;
res[0] = Math.min(res[0], node.val);
res[1] = Math.max(res[1], node.val);
return res;
}
}
js代码:
注意js代码使用全局变量时,要在主函数中对其进行初始化,否则使用上一组用例的值。
/**
* @param {TreeNode} root
* @return {number}
*/
let max = 0;
var maxAncestorDiff = function(root) {
max = 0;
trace(root)
return max;
};
function trace(root) {
if(root.left === null && root.right === null) {
return [root.val, root.val];
}
let left = [root.val, root.val];
let right = [root.val, root.val];
if(root.left !== null) {
left = trace(root.left);
}
if(root.right !== null) {
right = trace(root.right);
}
let res = [Math.min(left[0], right[0]), Math.max(left[1], right[1])];
max = Math.max(max, Math.abs(root.val - res[0]), Math.abs(root.val - res[1]));
res[0] = Math.min(res[0], root.val);
res[1] = Math.max(res[1], root.val);
return res;
}