LeetCode50天刷题计划第二季(Day 15 — 求根节点到叶节点数字之和 被围绕的区域

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

困难像弹簧 你强他就弱 你弱它就强

一、题目

求根节点到叶节点数字之和

给你一个二叉树的根节点 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'


            
                    

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值