111. 二叉树的最小深度
BFS
从根节点 BFS搜索 其他节点 加入队列,然后依次出队,判断子节点是否存在 不存在则说明搜索到叶子节点,然后返回其深度。
class Solution:
def minDepth(self, root: TreeNode) -> int:
if not root:
return 0
que = [[root,1]]
while que:
node ,num = que.pop(0)
if not node.left and not node.right:
return num
if node.left:
que.append([node.left,num+1])
if node.right:
que.append([node.right,num+1])
815. 公交路线
BFS
由于求解的目标是最少乘坐的公交车数量,对于同一辆公交车,可以无代价的经过其所有站点,所以面对起始站点和目标站点,可以转换思路,把经过起始站点的公交车当作起始结点,目标是换乘到经过目标站点的公交车上。
那么首先可以构建一个公交车与公交车之间的可达 邻接矩阵,使用BFS在该矩阵上找到 起始站点到目标站点的最短距离,每个节点之间的转移代价为1
class Solution:
def numBusesToDestination(self, routes: List[List[int]], source: int, target: int) -> int:
if source == target:
return 0
#构建 每个站点所经过的公交号
dic = defaultdict(list)
for i in range(len(routes)):
for sta in routes[i]:
dic[sta].append(i)
#print(dic)
n = len(routes)
# 构建公交车与公交车 邻接矩阵
car = [[0]*n for _ in range(n)]
for lis in dic:
#print(dic[lis])
if len(dic[lis])>1:
for i in range(len(dic[lis])):
for j in range(i+1,len(dic[lis])):
x,y =dic[lis][i],dic[lis][j]
car[x][y],car[y][x] =1,1
soulis = dic[source]
tardic =defaultdict(int)
for i in dic[target]:
tardic[i]=1
vis = [0]*n
que = []
for sou in soulis:
vis[sou] = 1
que.append([sou,1])
while que:
snum,tim = que.pop(0)
#判断该线路会不会经过终点
if tardic[snum]==1 :
return tim
#根据其邻接矩阵来找到其可达线路
for i in range(n):
if car[snum][i] ==1 and vis[i]==0:
vis[i] = 1
que.append([i,tim+1])
return -1