初学python记录:力扣1026. 节点与其祖先之间的最大差值

题目:

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

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

思考:

题意:在二叉树中找到非同辈的节点之间差值的最大值

1. 枚举所有的祖先节点x(即除去叶子节点以外的所有节点)

2. 对每个节点x,找出它的最大子节点max和最小子节点min(因为要求差值绝对值的最大值,那么保持减数/被减数不变的情况下,被减数/减数取最大值或最小值,才能使差值绝对值最大)

3. 每个节点x的最大差值V_x为|x-max|和|x-min|中的更大值

4. 从所有节点的最大差值V中取最大值,即为最后的结果

代码如下:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def maxAncestorDiff(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        # 遍历节点node的所有子节点,找到最大的和最小的子节点
        def findSons(node, max_son, min_son):
            if node is None:
                return [max_son, min_son]
            if node.left:
                max_son = max(max_son, node.left.val)
                min_son = min(min_son, node.left.val)
                max_son, min_son = findSons(node.left, max_son, min_son)
            if node.right:
                max_son = max(max_son, node.right.val)
                min_son = min(min_son, node.right.val)
                max_son, min_son = findSons(node.right, max_son, min_son)
            return [max_son, min_son]


        # 枚举所有祖先节点,与其最大最小子节点进行计算、比较
        def dfs(node):
            if node is None:
                return 0
            if node is not None and (node.left or node.right):
                max_son = -1
                min_son = float('inf')
                max_son, min_son = findSons(node, max_son, min_son)
                res = max(abs(max_son - node.val), abs(min_son - node.val))
                V = max(res, dfs(node.left), dfs(node.right))
                return V
            return 0

        return dfs(root)

提交通过:

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值