1. 程式人生 > 其它 >二叉樹的層序遍歷模板

二叉樹的層序遍歷模板

二叉樹的層序遍歷按字面意思就是一層一層的遍歷二叉樹

如圖,使用二叉樹的層序遍歷結果應該為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

上一題是求最大深度,所以可以全部遍歷後求結果,這題是求最小深度,那麼要注意葉子節點是指沒有左右節點的節點。

以上就是二叉樹層序遍歷模板的應用,題型略有變化,但是模板都是一個。在此非常感謝程式碼隨想錄提供的模板和題型供我學習。

搜尋

複製