Leetcode| 二叉树的层序遍历、226. 翻转二叉树、101. 对称二叉树 Day15

二叉树的层序遍历

队列先进先出,符合一层一层遍历的逻辑。

102. 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
from queue import Queue
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        que = Queue()
        res = []
        if root == None:
            return res
        que.put(root)
        while not que.empty():
            tmp = []
            size = que.qsize()
            for _ in range(size):
                node = que.get()
                tmp.append(node.val)
                if node.left:
                    que.put(node.left)
                if node.right:
                    que.put(node.right)
            res.append(tmp)
        return res

107. 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
from queue import Queue
class Solution:
    def levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:
        que = Queue()
        res = []
        if root == None:
            return res
        que.put(root)
        while not que.empty():
            tmp = []
            size = que.qsize()
            for _ in range(size):
                node = que.get()
                tmp.append(node.val)
                if node.left:
                    que.put(node.left)
                if node.right:
                    que.put(node.right)
            res.append(tmp)
        res.reverse()
        return res

199. 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
from queue import Queue
class Solution:
    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
        que = Queue()
        res = []
        if root == None:
            return res
        que.put(root)
        while not que.empty():
            tmp = []
            size = que.qsize()
            for _ in range(size):
                node = que.get()
                tmp.append(node.val)
                if node.left:
                    que.put(node.left)
                if node.right:
                    que.put(node.right)
            res.append(tmp[-1])
        return res

637. 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
from queue import Queue
class Solution:
    def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
        que = Queue()
        res = []
        if root == None:
            return res
        que.put(root)
        while not que.empty():
            tmp = []
            size = que.qsize()
            for _ in range(size):
                node = que.get()
                tmp.append(node.val)
                if node.left:
                    que.put(node.left)
                if node.right:
                    que.put(node.right)
            average = sum(tmp) / size
            res.append(average)
        return res

429. 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
"""
from queue import Queue
class Solution:
    def levelOrder(self, root: 'Node') -> List[List[int]]:
        que = Queue()
        res = []
        if root == None:
            return res
        que.put(root)
        while not que.empty():
            tmp = []
            size = que.qsize()
            for _ in range(size):
                node = que.get()
                tmp.append(node.val)
                if node.children:
                    for child in node.children:
                        que.put(child)
            res.append(tmp)
        return res

515. 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
from queue import Queue
class Solution:
    def largestValues(self, root: Optional[TreeNode]) -> List[int]:
        que = Queue()
        res = []
        if root == None:
            return res
        que.put(root)
        while not que.empty():
            tmp = []
            size = que.qsize()
            for _ in range(size):
                node = que.get()
                tmp.append(node.val)
                if node.left:
                    que.put(node.left)
                if node.right:
                    que.put(node.right)
            res.append(max(tmp))
        return res

116. Populating Next Right Pointers in Each Node

"""
# Definition for a Node.
class Node:
    def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next
"""
from collections import deque
class Solution:
    def connect(self, root: 'Optional[Node]') -> 'Optional[Node]':
        que = deque()
        if root == None:
            return root
        que.append(root)
        while que:
            size = len(que)
            for i in range(size):
                node = que.popleft()
                if i == size - 1:
                    node.next = None
                else:
                    node.next = que[0]
    
                if node.left:
                    que.append(node.left)
                if node.right:
                    que.append(node.right)

        return root

117. Populating Next Right Pointers in Each Node II

"""
# Definition for a Node.
class Node:
    def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next
"""
from collections import deque
class Solution:
    def connect(self, root: 'Node') -> 'Node':
        que = deque()
        if root == None:
            return root
        que.append(root)
        while que:
            size = len(que)
            for i in range(size):
                node = que.popleft()
                if i == size - 1:
                    node.next = None
                else:
                    node.next = que[0]
    
                if node.left:
                    que.append(node.left)
                if node.right:
                    que.append(node.right)

        return root

104. 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
from queue import Queue
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        res = 0
        que = Queue()
        if root == None:
            return res
        que.put(root)
        while not que.empty():
            size = que.qsize()
            for _ in range(size):
                node = que.get()
                if node.left:
                    que.put(node.left)
                if node.right:
                    que.put(node.right)
            res += 1
        return res


111. 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
from queue import Queue
class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        res = 0
        que = Queue()
        if root == None:
            return res
        que.put(root)
        while not que.empty():
            size = que.qsize()
            for _ in range(size):
                node = que.get()
                if not node.left and not node.right:    # 叶子节点
                    return res + 1
                if node.left:
                    que.put(node.left)
                if node.right:
                    que.put(node.right)
            res += 1
        # return res

226. Invert 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 invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        def preTraversal(root):
            if root == None:
                return
            root.left, root.right = root.right, root.left   # 中
            preTraversal(root.left)                         # 左
            preTraversal(root.right)                        # 右
        
        preTraversal(root)
        return root

101. Symmetric 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 isSymmetric(self, root: Optional[TreeNode]) -> bool:

        def compare(left, right):
            # 存在空节点
            if left == None and right != None:
                return False
            if left != None and right == None:
                return False
            if left == None and right == None:
                return True
            # 不存在空节点,数值不相等
            if left.val != right.val:
                return False

            # 此时就是:左右节点都不为空,且数值相同的情况
            # 此时才做递归,做下一层的判断
            outside = compare(left.left, right.right)
            inside = compare(left.right, right.left)
            isSame = outside and inside
            return isSame

        if root == None:
            return True
        return compare(root.left, root.right)

        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值