"""
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)
輸出結果如下: