mirror of
https://github.com/SunnyQjm/algorithm-review.git
synced 2026-06-03 08:16:43 +08:00
97 lines
3.0 KiB
Python
97 lines
3.0 KiB
Python
#!/usr/bin/env python
|
|
# coding=utf-8
|
|
|
|
#######################################################################################
|
|
# Leetcode 102 二叉树的层序遍历
|
|
#
|
|
# 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
|
|
#
|
|
# 示例:
|
|
# 二叉树:[3,9,20,null,null,15,7],
|
|
#
|
|
# 3
|
|
# / \
|
|
# 9 20
|
|
# / \
|
|
# 15 7
|
|
# 返回其层次遍历结果:
|
|
#
|
|
# [
|
|
# [3],
|
|
# [9,20],
|
|
# [15,7]
|
|
# ]
|
|
#######################################################################################
|
|
|
|
from typing import List
|
|
import collections
|
|
|
|
|
|
class TreeNode:
|
|
def __init__(self, x):
|
|
self.val = x
|
|
self.left = None
|
|
self.right = None
|
|
|
|
def __repr__(self):
|
|
if self:
|
|
return "{}->{}->{}".format(self.val, repr(self.left), repr(self.right))
|
|
|
|
|
|
class Solution:
|
|
def levelOrder(self, root: TreeNode) -> List[List[int]]:
|
|
"""
|
|
:type root: TreeNode
|
|
:rtype List[List[int]]
|
|
|
|
(knowledge)
|
|
|
|
思路:
|
|
1. 采用图的BFS遍历的思想对树进行逐层遍历;
|
|
2. 用queue来实现BFS;(由于这边是树型结构,所以不会有环路,故不需要用visited来记录哪些节点已经访问过)
|
|
3. 为了记录当前遍历的节点在哪一层,我们用两个变量curLevelNum和nextLevelNum来分别记录当前层次还有多少没有遍历,以及下一层次还有多少没有遍历
|
|
|
|
tip: ppt中用的是DFS的方法,那种方法可以更容易的记录当前节点所属层级
|
|
"""
|
|
|
|
# 特判树为空的情况
|
|
if not root:
|
|
return []
|
|
|
|
# 初始时curLevelNum = 1表示要遍历的第一层为根节点只有一个
|
|
# 初始时nextLevelNum = 0,当遍历节点时,会增加下一层的可遍历节点数量
|
|
curLevelNum, nextLevelNum = 1, 0
|
|
result = [[]]
|
|
queue = collections.deque([root])
|
|
|
|
while queue:
|
|
curNode = queue.popleft()
|
|
result[-1].append(curNode.val)
|
|
curLevelNum -= 1
|
|
|
|
# 判断当前节点的左右节点是否存在,存在则入队
|
|
if curNode.left:
|
|
queue.append(curNode.left)
|
|
nextLevelNum += 1
|
|
if curNode.right:
|
|
queue.append(curNode.right)
|
|
nextLevelNum += 1
|
|
|
|
if curLevelNum == 0: # 判断是否换层
|
|
curLevelNum, nextLevelNum = nextLevelNum, 0
|
|
# 如果下一层还有可遍历的节点,则往结果集里面新加一个空列表用来存储下一层的遍历结果
|
|
if curLevelNum != 0:
|
|
result.append([])
|
|
|
|
return result
|
|
|
|
|
|
if __name__ == '__main__':
|
|
solution = Solution()
|
|
root = TreeNode(3)
|
|
root.left = TreeNode(9)
|
|
root.right = TreeNode(20)
|
|
root.right.left = TreeNode(15)
|
|
root.right.right = TreeNode(7)
|
|
print(solution.levelOrder(root), "= [[3], [9, 20], [15, 7]]")
|