"""
2023.04.18|1026. 节点与其祖先之间的最大差值
题目分析:
这题是中等难度,关键二叉树的遍历
理论:DFS
1.维所一个全局变量self.ret用以记录结果
2.DFS主程序:root,maxNum,minNum
2.1 获取maxNum和minNum
2.2 计算最大差值diff
2.3 递归进行DFS的left和right
注意/难点:
将max和min在DFS中传递,以方便计算差值
"""
import numpy as np
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
ret=0 #维所一个全局变量
def maxAncestorDiff(self,root:TreeNode) -> int:
if not root: return 0 #特判,tree为空
self.dfs(root,root.val,root.val) #调用dfs
return self.ret #返回结果
#dfs主程序,这里将dfs和求解程序写在同一层;
#也可以把dfs写在求解程序下一层,用nonlocal指定全局变量ret
def dfs(self,node,maxNum,minNum):
if not node:
return
maxNum=max(maxNum,node.val)
minNum=min(minNum,node.val)
self.ret=max(self.ret,abs(maxNum-minNum)) #和当前结果比较
print(f'node={node.val};ret={self.ret};max={maxNum};min={minNum}')
self.dfs(node.left,maxNum,minNum) #递归左树
self.dfs(node.right,maxNum,minNum) #递归左树
def stringToTreeNode(inputValues):
root = TreeNode(int(inputValues[0]))
nodeQueue = [root]
front = 0
index = 1
while index < len(inputValues):
node = nodeQueue[front]
front = front + 1
item = inputValues[index]
index = index + 1
if item != "null":
leftNumber = int(item)
node.left = TreeNode(leftNumber)
nodeQueue.append(node.left)
if index >= len(inputValues):
break
item = inputValues[index]
index = index + 1
if item != "null":
rightNumber = int(item)
node.right = TreeNode(rightNumber)
nodeQueue.append(node.right)
return root
def PrintTreeNode(root,n):
if not root:
return
# print(root.val)
out[n].append(str(root.val))
PrintTreeNode(root.left,n+1)
PrintTreeNode(root.right,n+1)
out=[[] for _ in range(5)]
nums = [8,3,10,1,6,"null",14,"null","null",4,7,13]
root=stringToTreeNode(nums)
PrintTreeNode(root,0)
for item in out:
print(' '.join(item).center(20," "))
ans=Solution().maxAncestorDiff(root)
print(ans)
输出结果如下: