BFS

广度优先搜索----BFS

方法:BFS使用队列,把每个还没有搜索到的点依次放入队列,然后再弹出队列的头部元素当做当前遍历点。
BFS总共有两个模板:
1.如果不需要确定当前遍历到了哪一层,BFS模板如下。来自力扣大佬

while queue 不空:
    cur = queue.pop()
    for 节点 in cur的所有相邻节点:
        if 该节点有效且未访问过:
            queue.push(该节点)

2.如果要确定当前遍历到了哪一层,BFS模板如下。
这里增加了level表示当前遍历到二叉树中的哪一层了,也可以理解为在一个图中,现在已经走了多少步了。size表示在当前遍历层有多少个元素,也就是队列中的元素数,我们把这些元素一次性遍历完,即把当前层的所有元素都向外走了一步。

level = 0
while queue 不空:
    size = queue.size()
    while (size --) {
        cur = queue.pop()
        for 节点 in cur的所有相邻节点:
            if 该节点有效且未被访问过:
                queue.push(该节点)
    }
    level ++;

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

题目:给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值

思路:
1)利用广度优先搜索进行层次遍历,记录下每层的最后一个元素
2)利用递归和先序的思想,根节点–》右节点–》左节点,把每层的最右边孩子节点加入

#方法1
def rightSideView(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        res=[]
        depth=[]
        layer= collections.deque()					#创建一个队列
        layer.append(root)         					#存入根节点
        while len(layer): 
            count=0   								#某层的第几个元素
            next_layer=[] 							#下一层
            while len(layer):
                tmp = layer.popleft()				#从队列中取值
                if count==0:						#取某层第一个元素的值
                    res.append(tmp.val)
                count+=1
                if tmp.right:				
                    next_layer.append(tmp.right)	#先存入右孩子结点
                if tmp.left:
                    next_layer.append(tmp.left)
            layer = collections.deque(next_layer)  #开始遍历下一层
        return res
            
#方法2
 def rightSideView(self, root: TreeNode) -> List[int]:
        res=[]
        def dfs(root,depth):
            if not root:
                return []
            if len(res)<depth: 					   #当前层的第一个孩子节点(从右往左算起)
                res.append(root.val)
            dfs(root.right,depth+1) 			   #先存入右节点
            dfs(root.left,depth+1)  

        dfs(root,1)
        return res  

2.地图分析(medium)

题目:你现在手里有一份大小为 N x N 的「地图」(网格) grid,上面的每个「区域」(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,请你找出一个海洋区域,这个海洋区域到离它最近的陆地区域的距离是最大的。我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0 - x1| + |y0 - y1| 。如果我们的地图上只有陆地或者海洋,请返回 -1。

思路:

3.机器人的运动范围(medium)

题目:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

思路:

4.矩阵(medium)

题目:给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。

思路:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值