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

代码随想录算法训练营第n天 |

总结

针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历。

二叉树解题的大忌就是自己稀里糊涂的过了(因为这道题相对简单),但是也不知道自己是怎么遍历的。

102 二叉树的层序遍历

题目链接:

leecode-层序遍历

自己想

首先层序遍历是广度优先搜索,而二叉树递归遍历则是深度优先搜索
1.用队列实现,如何确定每一层被遍历完了呢?
2.和以前学的知识有没有联系,以前学过用deque做,deque是一个双向队列,利用popleft()时间复杂度为 O ( n ) O(n) O(n)

看完题解

如何确定被遍历完了,很好的解释:

while queue:
            for _ range(len(queue)):
                result = []
                cur = queue.popleft()
                result.append(cur.val)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
                
            output_.append(result)
完整代码
# 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 collections import deque
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        queue = deque([root])
        output_ = []
        while queue:
            for _ range(len(queue)):
                result = []
                cur = queue.popleft()
                result.append(cur.val)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
                
            output_.append(result)

        return output_

226.翻转二叉树

题目链接:

leecode-翻转二叉树

自己想

1.自己按照递归三部曲来进行思考,先是看返回条件,然后看终止条件,然后看一次递归里面包含哪些操作
2.但是自己没有思考自己是用了那一个遍历顺序

看完题解

1.才意识到自己用的是前序遍历的原则
2.同时说到中序遍历会出错->其实我还没有特别透彻的理解二叉树,但是经过这次讲解,我又对二叉树更加深刻了
短一个图,未来补上

完整代码
# 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
        else:
            root.left,root.right = root.right,root.left
            self.invertTree(root.left)
            self.invertTree(root.right)
        
            return root

101. 对称二叉树

题目链接:

leecode-对称二叉树

自己想

1.用层序遍历即可
2.但是没有解决出现为null的情况,层序遍历会忽略null的情况,没想好有什么解决办法
自己写的错误代码:

        # while(queue):
        #     result = []
        #     for _ in range(len(queue)):
        #         cur = queue.popleft()
        #         result.append(cur.val)
        #         if cur.left:
        #             queue.append(cur.left)
        #         if cur.right:
        #             queue.append(cur.right)

        #     a = reversed(result)
        #     if list(a) != result: 
        #         return False   

        # return True
看完题解

1.自己的理解是对的,用层序遍历是对的,但是就是方法问题
2.解决问题关键点:把左右孩子分别放入队列中即可,不要按照从左到右的顺序,和以前的思路不一样。
3.在进行运算的时候,加入一些if分支结构的判断这样就可以判断是不是存在null的情况了,解决初始层序遍历时候null值不会被记录的问题

完整代码
# 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 collections import deque
class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        queue = deque()
        queue.append(root.left)
        queue.append(root.right)
        while(queue):
            leftnode = queue.popleft()
            rightnode = queue.popleft()
            if not leftnode and not rightnode:#不能返回true,这可能只是枝上的某一个节点
                continue
            elif not leftnode and rightnode or not rightnode and leftnode or leftnode.val != rightnode.val:
                return False

            queue.append(leftnode.left)
            queue.append(rightnode.right)
            queue.append(leftnode.right)
            queue.append(rightnode.left)

        return True

题目链接:

自己想
看完题解
完整代码
在这里插入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值