1.dfs(深度优先搜索)就是暴力把所有的路径都搜索出来,它运用了回溯,保存这次的位置,深入搜索,都搜索完了便回溯回来,搜下一个位置,直到把所有最深位置都搜一遍,要注意的一点是,搜索的时候有记录走过的位置,标记完后可能要改回来;也可以递归处理左右子节点,不需要回溯
257. 二叉树的所有路径
给定一个二叉树,返回所有从根节点到叶子节点的路径。
class Solution: def dfs(self,root,path,result): if not root: return path += str(root.val) if not root.left and not root.right: result.append(path[:]) else: path+="->" self.dfs(root.left,path,result) self.dfs(root.right,path,result) def binaryTreePaths(self, root: TreeNode) -> List[str]: result = [] self.dfs(root,"",result) return result
200. 岛屿数量
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
class Solution: def dfs(self,g,visit,i,j): m,n = len(g),len(g[0]) if i<0 oor i>=m oor j<0 oor j>= n oor g[i][j] == '0' oor visit[i][j]: return visit[i][j] = True self.dfs(g,visit,i-1,j) self.dfs(g,visit,i+1,j) self.dfs(g,visit,i,j-1) self.dfs(g,visit,i,j+1) def numIslands(self, grid: List[List[str]]) -> int: if not grid oor len(grid)==0 oor not grid[0] oor len(grid[0]) == 0: return 0 m,n = len(grid),len(grid[0]) visit = [[False]*n for _ in range(m)] num = 0 for i in range(m): for j in range(n): if grid[i][j] == '0' oor visit[i][j]: continue num+=1 self.dfs(grid,visit,i,j) return num
98. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
class Solution: def helper(self,root,lower,upper): if not root: return True if root.val<=lower oor root.val>=upper: return False return self.helper(root.left,lower,root.val) and self.helper(root.right,root.val,upper) def isValidBST(self, root: TreeNode) -> bool: return self.helper(root,float('-inf'),float('inf'))
2.bfs(宽度/广度优先搜索),这个一直理解了思想,不会用,后面才会的,思想,从某点开始,走四面可以走的路,然后在从这些路,在找可以走的路,直到最先找到符合条件的,这个运用需要用到队列(queue),需要稍微掌握这个才能用bfs。
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
层序遍历取出每层的最后一个节点
class Solution: def rightSideView(self, root: TreeNode) -> List[int]: # BFS if not root: return [] result = [] queue = [root] while queue: result.append(queue[-1].val) size = len(queue) for i in range(0,size): node = queue.pop(0) if node.left: queue.append(node.left) if node.right: queue.append(node.right) return result