力扣刷题-python-二叉树-2(层序遍历、混合遍历)

1. 二叉树层序遍历

102. 二叉树的层序遍历 - 力扣(LeetCode) (leetcode-cn.com)

# 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 not root: return []
           queuer = [root]
           res,depth=[], -1   #depth表示层数
           while queuer:
               depth+=1
               res.append([])
               for _ in range(len(queuer)):
                   noder = queuer.pop(0)
                   res[depth].append(noder.val)
                   if noder.left: queuer.append(noder.left)  #将pop出的父结点的孩子节点压入
                   if noder.right:queuer.append(noder.right)
           return res

107. 二叉树的层序遍历 II - 力扣(LeetCode) (leetcode-cn.com)

# 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 not root : return []
        res, depth=[], -1
        queue= [root]
        while queue:
            depth+=1
            res.append([])
            for _ in range(len(queue)):
                noder = queue.pop(0)
                res[depth].append(noder.val)
                if noder.left: queue.append(noder.left)
                if noder.right:queue.append(noder.right)
        return res[::-1]

199. 二叉树的右视图 - 力扣(LeetCode) (leetcode-cn.com)

# 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: TreeNode) -> List[int]:
        #同二叉树层序遍历 但是只输出最后一个
        #可以考虑用队列
        if not root: return []
        res = []
        queue = [root]
        while queue:
            res.append(queue[-1].val)   #只输出末尾的 
            for _ in range(len(queue)):
                noder = queue.pop(0)
                if noder.left: queue.append(noder.left)
                if noder.right:queue.append(noder.right)
        return res

637. 二叉树的层平均值 - 力扣(LeetCode) (leetcode-cn.com)

# 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]:
        #同样的用队列
        queue =deque([root])  #换用队列会加快运算速度
        res = []
        while queue:
            n= len(queue)
            sum=0
            for _ in range(n):
                noder = queue.popleft()
                sum+=noder.val
                if noder.left: queue.append(noder.left)
                if noder.right:queue.append(noder.right)
            res.append(sum/n)
        return res

429. N 叉树的层序遍历 - 力扣(LeetCode) (leetcode-cn.com)

"""
# 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 not root : return []
        #用队列
        res,depth=[],-1
        queue= deque([root])
        while queue:
            res.append([])
            depth+=1
            for _ in range(len(queue)):
                noder = queue.popleft()
                res[depth].append(noder.val)
                if len(noder.children):queue.extend(noder.children)
        return res

515. 在每个树行中找最大值 - 力扣(LeetCode) (leetcode-cn.com)

# 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 not root :return []
        queue= deque([root])
        res=[]
        while queue:
            resLs=[]
            for __ in range(len(queue)):
                noder = queue.popleft()
                resLs.append(noder.val)
                if noder.left: queue.append(noder.left)
                if noder.right:queue.append(noder.right)
            res.append(max(resLs))
        return res

116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode) (leetcode-cn.com)

"""
# 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
"""
class Solution:
    def connect(self, root: 'Node') -> 'Node':
        if not root : return root
        queue= deque([root])
        while queue:
            for _ in range(len(queue)):
                noder =queue.popleft()
                if _: noderLeft.next = noder
                if noder.left: queue.append(noder.left)
                if noder.right:queue.append(noder.right)
                noderLeft= noder
        return root

117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode) (leetcode-cn.com)

"""
# 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
"""

class Solution:
    def connect(self, root: 'Node') -> 'Node':
         if not root:return root
         #用队列
         queue = deque([root])
         while queue:
               for _ in range(len(queue)):
                  noder = queue.popleft()
                  if _: nodeLeft.next = noder
                  nodeLeft = noder
                  if noder.left:queue.append(noder.left)
                  if noder.right:queue. append(noder.right)
         return root   

104. 二叉树的最大深度 - 力扣(LeetCode) (leetcode-cn.com)

# 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: TreeNode) -> int:
          if not root:return 0
          queue =deque([root])
          dapth=0
          while queue:
              dapth+=1
              for _ in range(len(queue)):
                 noder= queue.popleft()
                 if noder.left: queue. append(noder.left)
                 if noder.right: queue. append(noder.right)
          return dapth

111. 二叉树的最小深度 - 力扣(LeetCode) (leetcode-cn.com)

# 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 not root:return 0
      depth=0
      queue=deque([root])
      while queue:
         depth+=1
         for _ in range(len(queue)):
             noder = queue.popleft()
             if not noder.left and not noder.right: return depth
             if noder.left: queue.append( noder.left)
             if noder.right: queue.append( noder.right)
      return 0

3.对称二叉树

101. 对称二叉树 - 力扣(LeetCode) (leetcode-cn.com)
在这里插入图片描述

# 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: TreeNode) -> bool:
        '''
        #递归法:
        def compare(noderleft, noderright):
            #首先排除空节点的情况
            if not noderleft or not noderright:
                if not noderleft and not noderright:return True
                else:return False
            elif noderleft.val != noderright.val:return False

            #此时就是:左右节点都不为空,且数值相同的情况
            #此时才做递归,做下一层的判断
            outside =compare(noderleft.left, noderright.right) #左子树:左、 右子树:右
            inside  =compare(noderleft.right,noderright.left)  #左子树:右、 右子树:左
            return outside and inside                          #左子树:中、 右子树:中 (逻辑处理)
        return compare(root.left,root.right)
         '''
        '''
         #迭代法:用队列
        queue = deque([])
        queue.append(root.left)
        queue.append(root.right)
        while queue:
              leftnoder= queue.popleft()
              righnoder= queue.popleft()
              if not leftnoder and not righnoder: continue  #两个都为空 说明镜像
              if not leftnoder or not righnoder or leftnoder.val!= righnoder.val: return False
              queue.append(leftnoder.left)
              queue.append(righnoder.right)
              queue.append(leftnoder.right)
              queue.append(righnoder.left)
        return True
       '''
         #迭代法:用栈
        stacker = deque([])
        stacker.append(root.right)
        stacker.append(root.left)
        while stacker:
              leftnoder= stacker.pop()
              righnoder= stacker.pop()
              if not leftnoder and not righnoder: continue  #两个都为空 说明镜像
              if not leftnoder or not righnoder or leftnoder.val!= righnoder.val: return False
              stacker.append(righnoder.left)
              stacker.append(leftnoder.right)
              stacker.append(righnoder.right)
              stacker.append(leftnoder.left)
        return True         

100. 相同的树 - 力扣(LeetCode) (leetcode-cn.com)

# 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 isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        #相当于是从二叉树的第二层开始的
        #用栈把
        stacker = [p,q]

        while stacker:
            righnoder = stacker.pop()
            leftnoder = stacker.pop()

            if not righnoder and not leftnoder: continue
            if not righnoder or not leftnoder or righnoder.val!= leftnoder.val:return False

            stacker.append(leftnoder.left)   #注意这个顺序
            stacker.append(righnoder.left)
            stacker.append(leftnoder.right)
            stacker.append(righnoder.right)
        return True

572. 另一棵树的子树 - 力扣(LeetCode) (leetcode-cn.com)

# 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 isSubtree(self, root: TreeNode, subRoot: TreeNode) -> bool:
        def issame(noder,subRoot)->bool:
        #然后类似比较镜像方式 从第二个节点开始
        #用队列
            queue =deque([noder,subRoot])
            while queue:
                leftnoder = queue.popleft()
                righnoder = queue.popleft()
                if not leftnoder and not righnoder:continue
                if not leftnoder or not righnoder or leftnoder.val != righnoder.val:return False
                queue.append(leftnoder.left)
                queue.append(righnoder.left)
                queue.append(leftnoder.right)
                queue.append(righnoder.right)   
            return True

        #首先层序寻找 根节点的位置
        queue= deque([root])
        while queue:
            noder = queue.popleft()
            if noder.val == subRoot.val:
                if issame(noder,subRoot):return True
            if noder.left: queue.append(noder.left)
            if noder.right:queue.append(noder.right)
        return False

4.总结

太多了,感觉明天弄不完了,最多给自己四天时间把。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值