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

 目录 

102、二叉树的层序遍历

思路

代码

226、翻转二叉树 

思路

代码

101.对称二叉树

思路

代码


102、二叉树的层序遍历

看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大家可以很快刷了十道题。

题目链接/文章讲解/视频讲解:代码随想录

思路

        深入本质,一通百通。十道二叉树层序遍历题我是一口气全做完的,确实本质都是相通的,直接复制粘贴微调代码就可以了。层序遍历就是用队列,只要队列里不为空就一直while循环。

代码
import collections
from typing import List, Optional


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])
        res = []
        while queue:
            level = []
            for i in range(len(queue)):

                node = queue.popleft()
                level.append(node.val)
                if node.left:
                    queue.append(node.left)

                if node.right:
                    queue.append(node.right)

            res.append(level)
        return res

226、翻转二叉树 

这道题目 一些做过的同学 理解的也不够深入,建议大家先看我的视频讲解,无论做过没做过,都会有很大收获。

题目链接/文章讲解/视频讲解:代码随想录

思路

        哈哈哈,这道题我是凭直觉写的,直接就想着不就每一层左右互换就好了,结果一把就过。(主要是因为不需要考虑先后顺序)

代码
import collections
from typing import Optional


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 root

        queue = collections.deque([root])

        while queue:
            for i 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.对称二叉树

先看视频讲解,会更容易一些。 

题目链接/文章讲解/视频讲解:代码随想录

思路

        差一点就想出来了,大体思路是对的,一开始不知道对空节点怎么进行操作,链接里是if 非节点就在列表里加入None(没错,就是这么简单的问题我也做不对,一看就会,一些就废是我了)。这道题可以用多种数据结构来解,层序遍历,队列或者栈都可以解决。入栈的顺序是重点,其他只要会层序遍历问题不大。

代码
import collections
from typing import Optional


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:
        if not root:
            return True
        # 使用栈
        st = []
        st.append(root.left)
        st.append(root.right)
        while st:
            rightNode = st.pop()
            leftNode = st.pop()
            if not leftNode and not rightNode:
                return True

            if not leftNode or not rightNode or leftNode.val != rightNode.val:
                return False
            st.append(leftNode.left)
            st.append(rightNode.right)
            st.append(leftNode.right)
            st.append(rightNode.left)
        return True

        # 层序遍历
        # queue = collections.deque([root])
        #
        # while queue:
        #     level = []
        #     for i in range(len(queue)):
        #         node = queue.popleft()
        #
        #         if node:
        #             level.append(node.val)
        #             queue.append(node.left)
        #             queue.append(node.right)
        #         else:
        #             level.append(None)
        #
        #     if level != level[::-1]:
        #         return False
        #
        # return True
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值