【LeetCode 刷题】二叉树-广度优先遍历

此博客为《代码随想录》二叉树章节的学习笔记,主要内容为二叉树的广度优先遍历相关的题目解析。

文章目录

  • 102. 二叉树的层序遍历
  • 107. 二叉树的层序遍历 II
  • 199. 二叉树的右视图
  • 637. 二叉树的层平均值
  • 429. N 叉树的层序遍历
  • 515. 在每个树行中找最大值
  • 116. 填充每个节点的下一个右侧节点指针
  • 117. 填充每个节点的下一个右侧节点指针 II
  • 104.二叉树的最大深度
  • 111. 二叉树的最小深度

102. 二叉树的层序遍历

题目链接

class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root is None:
            return []
        res = []
        q = [root]
        while q:
            vals = []
            for _ in range(len(q)):
                node = q.pop(0)
                vals.append(node.val)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
            res.append(vals)
        return res
  • 使用队列作为辅助,队列先进先出,符合层序遍历的逻辑
  • 内层 for 循环的循环次数为 len(q),即当前要处理的层的节点个数

107. 二叉树的层序遍历 II

题目链接

class Solution:
    def levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root is None:
            return []
        res = []
        q = [root]
        while q:
            vals = []
            for _ in range(len(q)):
                node = q.pop(0)
                vals.append(node.val)
                if node.left: 
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
            res.append(vals)
        res.reverse()
        return res
  • 先基于常规的层序遍历,最后反转结果列表中的元素

199. 二叉树的右视图

题目链接

class Solution:
    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
        if root is None:
            return []
        res = []
        q = [root]
        while q:
            size = len(q)
            for i in range(size): 
                node = q.pop(0)
                if i == size - 1:
                    res.append(node.val)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
        return res
  • 由于内循环中需要用到循环次数作为 i 位置的判断,因此需要提前计算保存到临时变量中,不能在循环中调用 len(q)

637. 二叉树的层平均值

题目链接

class Solution:
    def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
        if root is None:
            return []
        res = []
        q = [root]
        while q:
            size = len(q)
            s = 0
            for i in range(size): 
                node = q.pop(0)
                s += node.val
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
            res.append(s / size)
        return res
  • 同样需要先计算临时变量 size

429. N 叉树的层序遍历

题目链接

class Solution:
    def levelOrder(self, root: 'Node') -> List[List[int]]:
        if root is None:
            return []
        res = []
        q = [root]
        while q:
            vals = []
            for i in range(len(q)): 
                node = q.pop(0)
                vals.append(node.val)
                for child in node.children:
                    q.append(child)
            res.append(vals)
        return res
  • 扩展节点时,通过循环遍历 children 字段

515. 在每个树行中找最大值

题目链接

class Solution:
    def largestValues(self, root: Optional[TreeNode]) -> List[int]:
        if root is None:
            return []
        res = []
        q = [root]
        while q:
            m = float('-inf')
            for i in range(len(q)): 
                node = q.pop(0)
                m = max(m, node.val)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
            res.append(m)
        return res
  • float('-inf') 表示负无穷

116. 填充每个节点的下一个右侧节点指针

题目链接

class Solution:
    def connect(self, root: 'Optional[Node]') -> 'Optional[Node]':
        if root is None:
            return root
        q = [root]
        while q:
            for i in range(len(q)): 
                node = q.pop(0)
                if i > 0:
                    pre.next = node
                pre = node
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
        return root
  • 在遍历过程中,同时使用 pre 指针记录前一个节点,当 i > 0 时,完成 pre.next = node 的赋值

117. 填充每个节点的下一个右侧节点指针 II

题目链接

class Solution:
    def connect(self, root: 'Node') -> 'Node':
        if root is None:
            return root
        q = [root]
        while q:
            for i in range(len(q)): 
                node = q.pop(0)
                if i > 0:
                    pre.next = node
                pre = node
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
        return root
  • 与上题解法完全相同

104.二叉树的最大深度

题目链接

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if root is None:
            return 0
        q = [root]
        cnt = 0
        while q:
            cnt += 1
            for i in range(len(q)): 
                node = q.pop(0)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
        return cnt
  • 二叉树最大的深度即为层序遍历的层数

111. 二叉树的最小深度

题目链接

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if root is None:
            return 0
        q = [root]
        cnt = 0
        while q:
            cnt += 1
            for i in range(len(q)): 
                node = q.pop(0)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
                if not node.left and not node.right:
                    return cnt
        return cnt
  • 当左右孩子都为空的时候,说明到达最小深度

你可能感兴趣的:(LeetCode,leetcode,算法,python,数据结构)