二叉树的层序遍历按字面意思就是一层一层的遍历二叉树
如图,使用二叉树的层序遍历结果应该为1234567
层序遍历一般用队列或者递归的框架,我主要学习队列的解法。为什么用队列,因为队列有先入先出的属性,非常符合层序遍历的特点。
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/
# 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 levelOrder(self, root: TreeNode) -> List[List[int]]: if root == None: return [] que = [root] ans = [] while que: length = len(que) ret = [] for i in range(length): cur = que.pop(0) ret.append(cur.val) if cur.left: que.append(cur.left) if cur.right: que.append(cur.right) ans.append(ret) return ans
一个标准的二叉树层序遍历模板
给你二叉树的根节点 root
,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/
# 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 levelOrderBottom(self, root: TreeNode) -> List[List[int]]: if root == None: return [] ans = [] que = [root] while que: ret = [] length = len(que) for i in range(length): cur = que.pop(0) ret.append(cur.val) if cur.left: que.append(cur.left) if cur.right: que.append(cur.right) ans.append(ret) return ans[::-1]
按照模板与102题非常类似,唯一不同的是这题是自底向上,而模板是自顶向下遍历的,所以遍历完成后需要翻转一下,就变成了自底向上了。
给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-tree-right-side-view/
# 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 rightSideView(self, root: Optional[TreeNode]) -> List[int]: if root == None: return [] ans = [] que = [root] while que: cur = que[-1] #因为是右视图,所以只需要取每层的最右侧的值就行,即队列的末尾 ans.append(cur.val) length = len(que) for i in range(length): cur = que.pop(0) if cur.left: que.append(cur.left) if cur.right: que.append(cur.right) return ans
给定一个非空二叉树的根节点 root
, 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5
以内的答案可以被接受。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/average-of-levels-in-binary-tree/
# 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 averageOfLevels(self, root: Optional[TreeNode]) -> List[float]: if root == None: return [] ans = [] que = [root] while que: ret = [] length = len(que) for i in range(length): cur = que.pop(0) ret.append(cur.val) if cur.left: que.append(cur.left) if cur.right: que.append(cur.right) ans.append(sum(ret) / len(ret)) return ans
一样的利用模板,最后取个平均值存入ans即可。
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/n-ary-tree-level-order-traversal/
""" # Definition for a Node. class Node: def __init__(self, val=None, children=None): self.val = val self.children = children """ class Solution: def levelOrder(self, root: 'Node') -> List[List[int]]: if root == None: return [] ans = [] que = [root] while que: ret = [] length = len(que) for i in range(length): cur = que.pop(0) ret.append(cur.val) if cur.children: que.extend(cur.children) #列表用extend拼接 ans.append(ret) return ans
模板是一样,注意不用列表append
给定一棵二叉树的根节点 root
,请找出该二叉树中每一层的最大值。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-largest-value-in-each-tree-row/
# 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 largestValues(self, root: Optional[TreeNode]) -> List[int]: if root == None: return [] ans = [] que = [root] while que: ret = [] length = len(que) for i in range(length): cur = que.pop(0) ret.append(cur.val) if cur.left: que.append(cur.left) if cur.right: que.append(cur.right) ans.append(max(ret)) return ans
按照模板来,最后取最大值存入ans中。
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree/
# 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 maxDepth(self, root: Optional[TreeNode]) -> int: if root == None: return 0 ans = [] que = [root] while que: ret = [] length = len(que) for i in range(length): cur = que.pop(0) ret.append(cur.val) if cur.left: que.append(cur.left) if cur.right: que.append(cur.right) ans.append(ret) return len(ans)
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-depth-of-binary-tree/
# 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 minDepth(self, root: TreeNode) -> int: if root == None: return 0 que = [(root, 1)] while que: length = len(que) for i in range(length): cur, step = que.pop(0) if cur.left == None and cur.right == None: return step if cur.left: que.append((cur.left, step +1)) if cur.right: que.append((cur.right, step + 1)) return 0
上一题是求最大深度,所以可以全部遍历后求结果,这题是求最小深度,那么要注意叶子节点是指没有左右节点的节点。
以上就是二叉树层序遍历模板的应用,题型略有变化,但是模板都是一个。在此非常感谢代码随想录提供的模板和题型供我学习。
搜索
复制