题目:
给定二叉树的根节点 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)
提交通过: