LeetCode | 2023.04.18|1026. 節點與其祖先之間的最大差值

"""
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)

輸出結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章