1
0
mirror of https://github.com/SunnyQjm/algorithm-review.git synced 2026-06-03 08:16:43 +08:00
Files
algorithm-review/chapter11/5_binary-tree-level-order-traversal.py
T
2020-06-22 15:13:28 +08:00

95 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]]")