leetcode 树深搜索用BFS方法
104题最大深度 & 111题最小深度
区别只在于终止条件不同,BFS框架一致
搜最大深度时,即使碰到某个节点无,也继续搜
搜最小深度时,只要出现左右都无子节点的悬挂点,就返回深度
附代码
104最大深度
class Solution:
def minDepth(self, root: TreeNode) -> int:
# BFS解法--遍历每一层,有的话则depth+1
# queue = collections.deque([root])
queue = []
queue.append(root)
depth = 0
while queue:
size = len(queue)
for _ in range(size):
# cur = queue.popleft()
cur = queue.pop(0)
if not cur:
continue
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
depth += 1
return depth
111最小深度
class Solution:
def minDepth(self, root: TreeNode) -> int:
# BFS解法二
if not root:
return 0
depth = 1
queue = []
queue.append(root)
while queue:
for i in range(len(queue)):
cur = queue.pop(0)
if not cur.left and not cur.right:
return depth
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
depth += 1
题目:103. 二叉树的锯齿形层序遍历
难度:中等
算法:BFS
# 2022.09.21
# 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 zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:
return[]
queue = [root]
ans = []
index = 1 # 加个index
while queue:
level = []
for i in range(len(queue)):
node = queue.pop(0)
level.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
if level:
if index == -1: # 如果index为-1,就是偶数层
level = level[::-1] # 偶数层翻一下
ans.append(level)
index = index * (-1) # 奇数层偶数层来回标记
return ans