题目:二叉树的层序遍历
给你一个二叉树,请你返回其按层序遍历得到的节点值。即逐层地,从左到右访问所有节点示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]
题解思路
1、递归编程思想+深度优先搜索
对深度进行记录,递归比较当前深度与结果列表中的元素列表的数量关系,将逐个遍历的元素填入对应的元素列表中即可。
def __init__(self): self.res = [] #存储最终结果的大列表#增加一个参数表示层级def levelOrder(self, root: TreeNode,level=0) -> List[List[int]]: # DFS #如果节点为空。直接返回一个空列表。根节点为空返回这个结果。子节点为空,相当于回退,不影响 if not root:return [] #如果当前层的子列表不存在,先新增一个空列表,后续再根据层值去插值 if len(self.res) <= level:self.res.append([]) self.res[level].append(root.val) level += 1 #更新层级 self.levelOrder(root.left,level) self.levelOrder(root.right,level) return self.res
执行结果
2、递归编程思想+广度优先搜索
初始化一个队列,首先将根节点放入队列中,并根据循环,将队列中各个节点的左右子树分别加入队列,并在过程中判断是否存在值,若存在则添加至结果列表中。
def levelOrder(self, root: TreeNode,level=0) -> List[List[int]]: queue = collections.deque() # 初始化队列 queue.append(root) # 首先将根节点压入栈中 res = [] # 初始化结果 while queue: # 循环队列 size = len(queue) # 获得队列长度即获得当前该层节点的个数 level = [] #该层列表初始化 for _ in range(size): # 对该层节点进行左右子树的广度优先 cur = queue.popleft() if not cur: continue level.append(cur.val) # 记录节点值 queue.append(cur.left) # 将该节点的左子节点入栈 queue.append(cur.right) # 将该节点的右子节点入栈 if level: # 该层列表不为空,则将该层列表添加到结果列表中。若为空则跳过 res.append(level) return res
执行结果
终于等到你,请关注我吧~