代码随想录 day15打卡

50 阅读3分钟

Leetcode 102. 二叉树的层序遍历

广度优先:队列 深度优先:栈 对于树而言,最重要的就是判断遍历顺序和处理节点顺序是否一致,并且根据需求调整。

一个写的很好的题解: leetcode.cn/problems/bi…

python中的双端队列 deque

class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        res=[]
        #先判断是否为空
        if not root:
            return res
        from collections import deque
        que = deque([root])
        while que: #终止条件,队列为空
            size=len(que)
            tempres=[]
            for i in range(size):#每层循环几次,根据当前队列
                cur =que.popleft()#当前指针
                tempres.append(cur.val)
                #要先判断当前指针左右是否为空才能入栈
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
            #设置tempres和res两个的原因在于,输出是要求一层一个列表,所以每层生成列表之后,再汇总到总列表里面!
            res.append(tempres)
        return res

Leetcode 226. 翻转二叉树

交换指的是交换指针,而不是交换数值,也就是说下面的左右孩子也是跟着交换的。

# 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 
        #单层循环逻辑
        #前序遍历比较好
        root.left,root.right = root.right,root.left#python本身就是基于指针
        self.invertTree(root.left)#又忘记加self了
        self.invertTree(root.right)

        return root

迭代(层序)

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        #if not root:return 
        from collections import deque
        que = deque()
        if root:
            que.append(root)
        while que:
            #基于层序遍历,要先确定有
            #每层怎么处理
            #先把所有结点加入
            #基于上层才能确定下层有多少个节点
            num = len(que)#要在for循环之前就算好这个数,不然每次for循环que大小会改变,处理不了该层了
            for i in range(num): #忘记写range了
                #每次弹出节点应该怎么处理
                cur=que.popleft()
                cur.left,cur.right = cur.right,cur.left#交换
                #在队列中加入他们,就像之前的父节点一样
                #加入之前要先判断是否为空指针!
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
        return root

Leetcode 101. 对称二叉树

关于递归终止条件的思考:因为递归的本质在于,大规模和小规模问题的解决模式一致,那么在判断终止条件的时候,只需要拿出来最小规模来制定终止条件。(之前的一个模糊点

递归方法

# 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:
        #先判断
        if not root:return True
        return self.compare(root.left,root.right)
    #定义递归,注意!他不是主函数的子函数!!!
    def compare(self,left,right):
        #终止条件
        if left==None and right!=None:return False
        elif right==None and left!=None:return False
        elif left ==None and right ==None :return True
        #if left.val == right.val: 这句是错的,这是往下递归的基础条件 
        #要先判断是否为空,在判断是不是数字!要不然会出现空节点的val
        elif left.val != right.val:return False
        #又忘记加self了
        outside = self.compare(left.left,right.right)
        inside = self.compare(left.right,right.left)
        #返回遍历结果
        res = outside and inside
        return res
    #return compare(root.left,root.right) 调用自身要加self!!!