前言
Weekly Contest 132的 节点与其祖先之间的最大差值:
给定二叉树的根节点
root
,找出存在于不同节点A
和B
之间的最大值V
,其中V = |A.val - B.val|
,且A
是B
的祖先。(如果
A
的任何子节点之一为B
,或者A
的任何子节点是B
的祖先,那么我们认为A
是B
的祖先)示例:
输入:[8,3,10,1,6,null,14,null,null,4,7,13] 输出:7 解释: 我们有大量的节点与其祖先的差值,其中一些如下: |8 - 3| = 5 |3 - 7| = 4 |8 - 1| = 7 |10 - 13| = 3 在所有可能的差值中,最大值 7 由 |8 - 1| = 7 得出。
提示:
- 树中的节点数在 2 到 5000 之间。
- 每个节点的值介于 0 到 100000 之间。
解题思路
本题需要将问题分解一下,首先先实现根节点与每个节点的差值的最大值的算法,然后只需要遍历每个子树即可。
实现代码
/**
* 5030. 节点与其祖先之间的最大差值
* @param root
* @return
*/
public int maxAncestorDiff(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int max=0;
while(!queue.isEmpty()){//层序遍历
TreeNode node=queue.poll();
max=Math.max(max,getMaxDiffByRoot(node));
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
return max;
}
/**
* 获取某个根节点下所有节点与根节点的差值的最大值
* 这里选择使用层序遍历
* @param root
* @return
*/
private int getMaxDiffByRoot(TreeNode root){
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
//根节点的值,用于比较
int rootValue=root.val;
//最大差值
int max=0;
while(!queue.isEmpty()){//层序遍历每个节点
TreeNode node=queue.poll();
// 获取最大值
max=Math.max(max,Math.abs(node.val-rootValue));
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
return max;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。