原作:image.png

⼀、数据结构的存储⽅式

image.pngimage.png
image.png

⼆、数据结构的基本操作

image.png

  1. def traverse(arr):
  2. for i in range(len(arr)):

image.png

  1. class ListNode:
  2. def __init__(self, x):
  3. self.val = x
  4. self.next = None
  5. def traverse(self, head: ListNode):
  6. p = head
  7. while p: # 迭代
  8. p = p.next
  9. # 递归
  10. def traverse(self, head: ListNode):
  11. traverse(head.next)

image.png

  1. class TreeNode:
  2. def __init__(self, val=0, left=None, right=None):
  3. self.val = val
  4. self.left = left
  5. self.right = right
  6. # 递归
  7. def traverse(self, root: TreeNode) :
  8. traverse(root.left)
  9. traverse(root.right)

image.png

  1. class TreeNode:
  2. def __init__(self, val=0, children=None):
  3. self.val = val
  4. self.children=TreeNode
  5. def traverse(self,root:TreeNode): # 瞎写的,不会
  6. for child in root.children:
  7. traverse(child)

image.png
image.png

三、算法刷题指南

image.pngimage.png

  1. def traverse(self, root: TreeNode) :
  2. # 前序
  3. traverse(root.left)
  4. # 中序
  5. traverse(root.right)
  6. # 后序

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

  1. class Solution:
  2. def maxPathSum(self, root: TreeNode) :
  3. self.maxsum = float('-inf')
  4. def dfs(root):
  5. if not root: return 0
  6. left = dfs(root.left)
  7. right = dfs(root.right)
  8. self.maxsum = max(self.maxsum, left + right + root.val)
  9. return max(0, max(left, right) + root.val) # 神来之笔
  10. dfs(root)
  11. return self.maxsum

image.png
https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

  1. class Solution:
  2. def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
  3. if not preorder or not inorder: # 递归终止条件
  4. return
  5. root = TreeNode(preorder[0]) # 先序为“根左右”,所以根据preorder可以确定root
  6. idx = inorder.index(preorder[0]) # 中序为“左根右”,根据root可以划分出左右子树
  7. # 下面递归对root的左右子树求解即可
  8. root.left = self.buildTree(preorder[1:1 + idx], inorder[:idx])
  9. root.right = self.buildTree(preorder[1 + idx:], inorder[idx + 1:])
  10. return root

image.png
https://leetcode-cn.com/problems/recover-binary-search-tree/

  1. class Solution:
  2. def recoverTree(self, root: TreeNode) -> None:
  3. """
  4. Do not return anything, modify root in-place instead.
  5. """
  6. Trees = lambda x: [] if not x else Trees(x.left) + [x] + Trees(x.right)
  7. a = Trees(root)
  8. sa = sorted(a, key=lambda x: x.val)
  9. p, q = [a[i] for i in range(len(a)) if a[i] != sa[i]]
  10. p.val, q.val = q.val, p.val

image.png
image.png

  1. def coinChange(coins: List[int], amount: int):
  2. def dp(n): # 为组成金额 n 所需最少的硬币数量
  3. if n == 0: return 0
  4. if n < 0: return -1
  5. res = float('INF')
  6. for coin in coins:
  7. subproblem = dp(n - coin)
  8. # ⼦问题⽆解,跳过
  9. if subproblem == -1: continue
  10. res = min(res, 1 + subproblem)
  11. return res if res != float('INF') else -1
  12. return dp(amount)
  1. # 不过是⼀个 N 叉树的遍历问题⽽已
  2. def dp(n):
  3. for coin in coins:
  4. dp(n - coin)

image.png

  1. class Solution:
  2. def solveNQueens(self, n: int) -> List[List[str]]:
  3. res = []
  4. s = "." * n
  5. def backtrack(i, tmp,col,z_diagonal,f_diagonal):
  6. if i == n:
  7. res.append(tmp)
  8. return
  9. for j in range(n):
  10. if j not in col and i + j not in z_diagonal and i - j not in f_diagonal:
  11. backtrack(i+1,tmp + [s[:j] + "Q" + s[j+1:]],
  12. col | {j}, z_diagonal |{i + j} , f_diagonal |{i - j} )
  13. backtrack(0,[],set(),set(),set())
  14. return res

image.pngimage.pngimage.png