Leetcode 刷题笔记 (二叉树)

Leetcode 刷题笔记 (二叉树)

二叉树

  • Leetcode 刷题笔记 (二叉树)
    • idea
    • 二叉递归模板
      • 543. 二叉树的直径 (easy)
      • 124. 二叉树中的最大路径和(hard) 同543
      • 199. 二叉树的右视图(medium)
      • 337. 打家劫舍 III(medium) dfs + dp

idea

  1. dfs递归搜索二叉

二叉递归模板

def dfs (node):
      if not node:
         return 0
      left = dfs(node.left)
      right = dfs(node.right)
      执行 rst = node.val + left + right
      return left, right #返回由left和right递归出来的值

543. 二叉树的直径 (easy)

https://leetcode.cn/problems/diameter-of-binary-tree/

# 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:
    def __init__(self):
        self.rst = 0
    def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
        def dfs(node):
            if not node:
                return 0
            left = max(0,dfs(node.left))
            right = max(0, dfs(node.right))
            self.rst = max(self.rst, left + right)
            return 1 + max(left,right)
        dfs(root)
        return self.rst

124. 二叉树中的最大路径和(hard) 同543

https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/

# 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:
    def __init__(self):
        self.rst = float('-inf')
    def maxPathSum(self, root: Optional[TreeNode]) -> int:
        def dfs(node):
            if not node:
                return 0
            left = max(0,dfs(node.left))
            right = max(0, dfs(node.right))
            self.rst = max(self.rst, node.val + left + right)

            return node.val + max(left, right)
        dfs(root)
        return self.rst

199. 二叉树的右视图(medium)

https://leetcode.cn/problems/binary-tree-right-side-view/

# 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:
    def __init__(self):
        self.rst = []
    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
        def dfs(node, length):
            if not node:
                return
            if len(self.rst) == length:
                self.rst.append(node.val)
            length += 1
            dfs(node.right, length)
            dfs(node.left, length)
        
        dfs(root,0)
        return self.rst

337. 打家劫舍 III(medium) dfs + dp

https://leetcode-cn.com/problems/house-robber-iii/

# 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:
    def rob(self, root: TreeNode) -> int:
        def dfs(node):
            if not node:
                return 0,0
            left = dfs(node.left)
            right = dfs(node.right)
            notchild = node.val + left[1] + right[1]
            getchild = max(left) + max(right)
            return notchild, getchild
        return max(dfs(root))

你可能感兴趣的:(leetcode,刷题笔记,leetcode,深度优先,算法)