Leetcode102
题目:层序遍历
学习资料:代码随想录
实现过程
- 利用队列来存储节点
- 记录队列的size来标记每一层对应的节点个数
- 注意一定要用变量size,而不是len(queue)因为queue一直在变化
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
result = []
if not root:
return []
queue = [root]
while queue:
size = len(queue)
temp = []
for i in range(size):
cur = queue.pop(0)
temp.append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
result.append(temp)
return result
Leetcode 199
题目:层序遍历
学习资料:代码随想录
初始思路
- 考虑奇数不行,只增加右节点也不行
- 只增加每层最后一个节点即可
学习后
- 思路基本一直,实现方法略有不同
实现过程
- list的pop(0)的时间复杂度是O(n),调包dequeue是O(1)
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
result = []
if not root:
return []
queue = [root]
while queue:
node = queue[-1]
result.append(node.val)
size = len(queue)
for i in range(size):
cur = queue.pop(0)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
return result
Leetcode 637
题目:层取平均
学习资料:代码随想录
实现过程
- 层序遍历,然后每层取平均
def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
result = []
if not root:
return []
queue = [root]
while queue:
size = len(queue)
re = 0
for i in range(size):
cur = queue.pop(0)
re += cur.val
if cur.left: queue.append(cur.left)
if cur.right: queue.append(cur.right)
re = re / size
result.append(re)
return result
Leetcode 429
题目:N插树
学习资料: 代码随想录
实现过程
- 注意children是list,可将每个node入队列
- 使用extend
def levelOrder(self, root: 'Node') -> List[List[int]]:
result = []
if not root:
return []
queue = [root]
while queue:
size = len(queue)
temp = []
for i in range(size):
cur = queue.pop(0)
temp.append(cur.val)
if cur.children:
queue.extend(cur.children)
result.append(temp)
return result
Leetcode 116
学习资料: 代码随想录
实现过程
- 每一次将出队的next设为队列的头部元素
- 注意当到达每一次最后一个节点时,不进行next赋值操作,默认指向null
def connect(self, root: 'Optional[Node]') -> 'Optional[Node]':
if not root:
return None
queue = [root]
while queue:
size = len(queue)
for i in range(size):
cur = queue.pop(0)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
#i = size-1就是该层最后一个,此时就不在连接
if i == size-1:
break
cur.next = queue[0]
#####或者使用一个tail尾节点标记
while queue:
size = len(queue)
tail = None
for i in range(size):
cur = queue.pop(0)
if tail:
tail.next = cur
tail = cur
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
return root
Leetcode 111
题目:二叉树最小深度
学习资料: 代码随想录
实现过程
- 二叉树最大深度就是二叉树的层数;而最小深度就是去看离root最近的叶子节点到root路径的深度。
- 注意只有当cur的左右都为空时,才为叶子节点,遇到叶子节点直接return 当前深度
depth = 0
if not root:
return 0
queue = [root]
while queue:
size = len(queue)
depth += 1
for i in range(size):
cur = queue.pop(0)
if cur.left == None and cur.right == None:
return depth
if cur.left: queue.append(cur.left)
if cur.right: queue.append(cur.right)
return 0
总结
重点掌握层序遍历的代码模版,熟练熟练再熟练,分析总结哪些问题可以使用层序遍历的方法。