前言

Weekly Contest 132节点与其祖先之间的最大差值

给定二叉树的根节点 root,找出存在于不同节点 AB 之间的最大值 V,其中 V = |A.val - B.val|,且 AB 的祖先。

(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 AB 的祖先)

示例:
2whqcep.jpg

输入:[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 得出。

提示:

  1. 树中的节点数在 2 到 5000 之间。
  2. 每个节点的值介于 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;
    }

Null
137 声望31 粉丝

免费的东西是最贵的,好走的只是下坡路