代码随想录算法训练营day15 | 102.层序遍历 、226.翻转二叉树 、101.对称二叉树

二叉树part02(24.01.10)

安排:先独立做题,然后看视频讲解,然后看文章讲解,然后再重新做一遍题,把题目AC,最后整理成今日当天的博客。


  • 学习时长:4h
  • 学习内容:自己尝试+pdf说明+视频+力扣题解+自己默写
  • 学习感悟:层序遍历一道更比十道强,今天习题量我服了

102.层序遍历

题目链接:力扣题目链接

笔记:

        需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

提交代码:

# 利用长度法
# 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: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []  
        queue = collections.deque([root])
        result = []
        while queue:
            level = [] #每遍历完一层级的节点就清零一次level
            for _ in range(len(queue)):
                cur = queue.popleft()
                level.append(cur.val)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
            result.append(level)
        return result   #因为结果要显示逐层的效果,每层放在一个数组里作为外层列表的元素

过程中报错:

        1.'NoneType' object has no attribute 'val' ^^^^^^^ level.append(cur.val) 这是因为没有在最开始考虑到二叉树为空的情况。解决方式:在前面添加两行代码:

if not root:
           return []

关于一次解决十题:

        原代码版本上对结果进行一个倒序重排即可:return result[::-1] 

         原代码版本上每层只放最右的节点(level的最后一个数):result.append(level[-1])

        原代码版本上对每一层级的数组求平均值:

                ave = sum(level)/len(level)

                result.append(ave)

         这题不太会,感觉就是在最内层两if循环那里变动,但是不太清楚怎么变。

         max_ = max(level)

         result.append(max_)

         注意!返回的是根节点!!这个题好奇怪,我做了半天,贴一下提交通过的代码:

"""
# 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: 'Optional[Node]') -> 'Optional[Node]':
        if not root:
            return root
        queue = collections.deque([root])
        while queue:
            level = [] 
            for _ in range(len(queue)):
                cur = queue.popleft()
                level.append(cur)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
            for i in range(len(level)-1):
                level[i].next = level[i+1]
        return root

        chat了一下:level[-1].next = None,这是不必要的,因为在创建 Node 对象时,next 属性已经被设置为 None。可以删除。

        和上一题一模一样的代码= = 

        原代码基础上将result初始设为0,实际上是计算level的个数 :

                 result += 1

            return result

        这题不会,先跳了。


226.翻转二叉树(没看递归法)

题目链接:力扣题目链接

笔记:

        1.遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。

提交代码:

# 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]:
        if not root:
            return None
        queue = collections.deque([root])
        while queue:
            for _ in range(len(queue)):
                node = queue.popleft()
                node.left, node.right =node.right, node.left
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
        return root


101.对称二叉树 

题目链接:力扣题目链接

笔记:

提交代码:

过程中报错:

(这道题明天看)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值