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)

输出结果如下:

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