提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
困难像弹簧 你强他就弱 你弱它就强
一、题目
求根节点到叶节点数字之和
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
示例
示例 1:
输入:root = [1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25
示例 2:
输入:root = [4,9,0,5,1]
输出:1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495
从根到叶子节点路径 4->9->1 代表数字 491
从根到叶子节点路径 4->0 代表数字 40
因此,数字总和 = 495 + 491 + 40 = 1026
提示
树中节点的数目在范围 [1, 1000] 内
0 <= Node.val <= 9
树的深度不超过 10
二、思路
现在虽然dfs已经很熟练了,但是细节问题必须要注意!!
深度优先遍历,一定要找准终止条件,此处就不能让root==None时终止,不仅因为叶子结点会重复计算左右两次,还因为只有左或右节点为None并不能说明此节点为叶子结点。这种想当然的错误一定要避免
三、代码
# 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 sumNumbers(self, root: Optional[TreeNode]) -> int:
ssum=[0]
#完成条件一定要找准确,本题要求的是叶子节点,那就不要是叶子节点的下一个结点,徒增问题
def dfs(root,ssum,count): #ssum当前总和(int);count当前数(字符串)
#判断当前结点是否是叶子结点
if(root.left == None and root.right == None):
ssum[0]+=int(count)
return
#如果有左孩子
if(root.left):
dfs(root.left,ssum,count+str(root.left.val))
#如果有右孩子
if(root.right):
dfs(root.right,ssum,count+str(root.right.val)) #右孩子
dfs(root,ssum,str(root.val))
return ssum[0]
四、题目
被围绕的区域
给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
示例
示例 1:
输入:board = [[“X”,“X”,“X”,“X”],[“X”,“O”,“O”,“X”],[“X”,“X”,“O”,“X”],[“X”,“O”,“X”,“X”]]
输出:[[“X”,“X”,“X”,“X”],[“X”,“X”,“X”,“X”],[“X”,“X”,“X”,“X”],[“X”,“O”,“X”,“X”]]
解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
示例 2:
输入:board = [[“X”]]
输出:[[“X”]]
提示:
m == board.length
n == board[i].length
1 <= m, n <= 200
board[i][j] 为 'X' 或 'O'
五、思路
本题中有三种符号,一种是原本的X,一种是边界上的O以及和边界相连的O,一种是其余的O
第一步先遍历所有边界,对于边界上的O,用dfs遍历和它直接相连的元素,把这些元素都变成A
最后遍历整个列表,将O变为X,将A变为O(这是一种标记的手法,而不用再记下具体的下标值,很方便)
六、代码
class Solution:
def solve(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
#本题中有三种符号,一种是原本的X,一种是边界上的O以及和边界相连的O,一种是其余的O
#第一步先遍历所有边界,对于边界上的O,用dfs遍历和它直接相连的元素,把这些元素都变成A
#最后遍历整个列表,将O变为X,将A变为O(这是一种标记的手法,而不用再记下具体的下标值,很方便)
m=len(board) #行
n=len(board[0]) #列
direction=[(0,1),(0,-1),(1,0),(-1,0)]
#dfs找连通的
def dfs(i,j):
board[i][j]='A'
for (di,dj) in direction:
if(i+di>=0 and i+di<m and j+dj>=0 and j+dj<n and board[i+di][j+dj] == 'O'):
dfs(i+di,j+dj)
#遍历找边界的O
for i in range(m):
for j in range(n):
if((i == 0 or i == m-1 or j==0 or j==n-1) and board[i][j]=='O'):
dfs(i,j)
#遍历把O变为X,将A变为O
for i in range(m):
for j in range(n):
if(board[i][j] == 'O'):
board[i][j] = 'X'
if(board[i][j] == 'A'):
board[i][j] = 'O'