其他分享
首页 > 其他分享> > 二叉树的层序遍历模板

二叉树的层序遍历模板

作者:互联网

二叉树的层序遍历按字面意思就是一层一层的遍历二叉树

 

如图,使用二叉树的层序遍历结果应该为1234567

层序遍历一般用队列或者递归的框架,我主要学习队列的解法。为什么用队列,因为队列有先入先出的属性,非常符合层序遍历的特点。

102. 二叉树的层序遍历

给你二叉树的根节点 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

一个标准的二叉树层序遍历模板

107. 二叉树的层序遍历 II

给你二叉树的根节点 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题非常类似,唯一不同的是这题是自底向上,而模板是自顶向下遍历的,所以遍历完成后需要翻转一下,就变成了自底向上了。

 

199. 二叉树的右视图

给定一个二叉树的 根节点 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

 

 

637. 二叉树的层平均值

给定一个非空二叉树的根节点 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即可。

 

429. N 叉树的层序遍历

给定一个 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

 

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

给定一棵二叉树的根节点 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中。

 

104. 二叉树的最大深度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

 

 

来源:力扣(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)

 

111. 二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

 

 

来源:力扣(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

上一题是求最大深度,所以可以全部遍历后求结果,这题是求最小深度,那么要注意叶子节点是指没有左右节点的节点。

以上就是二叉树层序遍历模板的应用,题型略有变化,但是模板都是一个。在此非常感谢代码随想录提供的模板和题型供我学习。

 

搜索

复制

标签:遍历,cur,val,self,层序,right,que,二叉树,left
来源: https://www.cnblogs.com/xiao-bai000/p/16322005.html