5030-节点与其祖先之间的最大差值

前言

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

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

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

示例:
2whqcep.jpgcode

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

提示:leetcode

  1. 树中的节点数在 2 到 5000 之间。
  2. 每一个节点的值介于 0 到 100000 之间。

解题思路

本题须要将问题分解一下,首先先实现根节点与每一个节点的差值的最大值的算法,而后只须要遍历每一个子树便可。get

实现代码

/**
     * 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;
    }
相关文章
相关标签/搜索