ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二叉树的层序遍历模板

2022-05-28 21:31:26  阅读:151  来源: 互联网

标签:遍历 cur val self 层序 right que 二叉树 left


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

 

如图,使用二叉树的层序遍历结果应该为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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有