day15,python算法打卡,二叉树3

   今日任务:

1)102.二叉树层序遍历

2)107.二叉树的层次遍历 II

3)二叉树的右视图

4)429.N叉树的层序遍历

5)一些其他可以用层序遍历的题目

6)翻转二叉树

102.二叉树层序遍历

题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode)

文字及视频讲解:代码随想录 (programmercarl.com)

思路:

        层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树,需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

具体实现:

        1,首先我们需要一个size记录每一层的节点数量

        2,循环size把每一层所有元素左边pop出来的同时,在右边加入下一层的元素,并记录下一层的节点数量

from collections import deque
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        queue = deque()
        queue.append(root)
        result = []
        

        if not root:
            return []

        size = 1
        while queue:
            layer_result = []
            for _ in range(size):
                node = queue.popleft()
                size -= 1
                layer_result.append(node.val)
                
                if node.left:
                    size +=1
                    queue.append(node.left)
                if node.right:
                    size += 1
                    queue.append(node.right)
            result.append(layer_result)
            
        return result

感想:

        有个代码错误认知:对于for _ in range(size):函数,range 函数在调用时就确定了序列的长度,函数内部size大小的变化并不会影响循环的次数。

107.二叉树的层次遍历 II

题目链接:107. 二叉树的层序遍历 II - 力扣(LeetCode)

思路: 

简单,在上一道题的基础上面反转列表就可以 

from collections import deque
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def levelOrderBottom(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if not root:
            return []
        queue = deque()
        queue.append(root)
        size = 1
        result= []

        while queue:
            layer_result = []
            for _ in range(size):
                node = queue.popleft()
                size -= 1
                layer_result.append(node.val)

                if node.left:
                    queue.append(node.left)
                    size += 1
                if node.right:
                    queue.append(node.right)
                    size +=1
            result.append(layer_result)

        return result[::-1]

        
        

 

199.二叉树的右视图

题目链接:199. 二叉树的右视图 - 力扣(LeetCode)

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
from collections import deque
class Solution(object):
    def rightSideView(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        
        # 不可以用递归法,因为例子虽然都是右边节点,但是如果左边节点超出了,也会看到左边节点
        # 方法采用层序遍历后,取出每一层最后一个值

        if not root:
            return []
        
        result = []
        queue = deque()
        queue.append(root)
        size = 1

        while queue:
            layer_result = []
            for _ in range(size):
                node = queue.popleft()
                size -= 1
                layer_result.append(node.val)

                if node.left:
                    queue.append(node.left)
                    size += 1
                if node.right:
                    queue.append(node.right)
                    size +=1
            result.append(layer_result[-1])

        return result

 感想:

        一样的套路,不过给的例子有迷惑性,给的例子一开始觉得只需要所有的右子树的节点,写了递归,提交后发现,如果左子树数量大于右子树的话,也会被看到。

429.N叉树的层序遍历

题目链接:429. N 叉树的层序遍历 - 力扣(LeetCode)

"""
# Definition for a Node.
class Node(object):
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution(object):
    def levelOrder(self, root):
        """
        :type root: Node
        :rtype: List[List[int]]
        """
        if not root:
            return []
        
        result = []
        queue = deque()
        queue.append(root)
        size = 1

        while queue:
            layer_result = []
            for _ in range(size):
                node = queue.popleft()
                size -= 1
                layer_result.append(node.val)

                for child in node.children:
                    queue.append(child)
                    size += 1
            result.append(layer_result)

        return result

 102.二叉树层序遍历

大致看了一眼基本都是算法变体,就不一一都做了

102.二叉树层序遍历

题目链接:226. 翻转二叉树 - 力扣(LeetCode)

文字及视频讲解:代码随想录 (programmercarl.com)

思路:

        首先需要判断使用哪一种遍历方式:前序遍历,后序遍历,层序遍历,递归遍历 都可以,但是中序遍历不可以,因为中序遍历会把某些节点的左右孩子翻转了两次!

我写的是层序遍历:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        if not root:
            return None
        
        queue = deque()
        queue.append(root)
        size = 1

        while queue:
            for _ in range(size):
                node = queue.popleft()
                size -= 1
                if node.left:
                    queue.append(node.left)
                    size += 1
                if node.right:
                    queue.append(node.right)
                    size += 1
                node.left, node.right = node.right, node.left
            
        return root

感想:

        写的多了就很顺利,需要注意的一点是这道题返回的是树结构,也就是如果root为空集,我们返回的应该是None而不是[],否则会报错。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值