刷题营 15天

102.二叉树的层序遍历

class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        queue = collections.deque([root])
        result = []
        while queue:
            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

回答:这个len queue 可以确定每层的节点个数,举个例子,一开始压入根节点,目前len queue 是1,然后for 循环内判断该节点是否有左右节点,假设都有,下次len queue 就是2了。假设没有,len queue 就是0了,以此类推 

class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        levels = []
        self.helper(root, 0, levels)
        return levels
    
    def helper(self, node, level, levels):
        if not node:
            return
        if len(levels) == level:
            levels.append([])  (if语句和这句是什么意思)
        levels[level].append(node.val)
        self.helper(node.left, level + 1, levels)
        self.helper(node.right, level + 1, levels)

回答:这是因为只要不是空节点,就需要是列表套列表哇,比如样例2,输入:root = [1]
输出:[[1]] 

226.翻转二叉树

初步想法:交换每个节点的左右子树, 直接用left,right=right,left

二叉树的遍历是基础,递归遍历,迭代遍历(用stack),层序遍历(用queue)

101. 对称二叉树

初步想法:

1、就是判断根节点的左右子树是否可以翻转(遍历左右子树,得到result1和result2,result1=reversed(result2))

题解:运用层序遍历只得到一个level_val的列表,判断条件 level_val==level_val【::-1】

lass Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        if not root:
            return True
        
        queue = collections.deque([root.left, root.right])
        
        while queue:
            level_size = len(queue)
            
            if level_size % 2 != 0:
                return False
            
            level_vals = []
            for i in range(level_size):
                node = queue.popleft()
                if node:
                    level_vals.append(node.val)
                    queue.append(node.left)
                    queue.append(node.right)
                else:
                    level_vals.append(None)
                    
            if level_vals != level_vals[::-1]:
                return False
            
        return True

2、判断外侧节点是否相等,内侧节点是否相等

遍历只能采用后序遍历(左右中)只有这样才能把左右节点的信息返回给中节点

问题:

利用双端队列,左子树从前出,右子树从后出 再相互比较,为什么会出错?

572 572. 另一棵树的子树

 问题:为什么结果相反?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值