• 6.3二叉树的层序遍历(LC102,LC107-M)


    二叉树的层序遍历(LC102):

    算法(长度法):

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

    举个例子模拟一下:

    对于空队列queue,创建一个level用于储藏每一层的值,创建应该result用于合并level。通过记录队列的长度,来判断level里面可以放多少个数:

    1. push入6,记录此时的len(queue)==1
    2. 将当前层元素弹出:leftpop 6\\level=[6],len(queue)==0
    3. push入6的左子树根节点4,此时的len(queue)==1
    4. push入6的右子树根节点7,此时的len(queue)==2\\queue = [4,7]
    5. 由于len(queue)==2,所以接下来只弹出两个元素
      1. 首先popleft 4
      2. push入4的左子树根节点1\\queue=[7,1]
      3. push入4的右子树根节点3\\queue=[7,1,3]
      4. 接着popleft 7\\ len(queue)==0,level=[4,7]
      5. push入7的左子树根节点5\\queue=[1]
      6. push入7的右子树根节点8,此时的len(queue)==4\\queue=[1,3,5,8]
    6. 由于len(queue)==4,所以接下来弹出4个元素
    7. level = [1,3,5,8]
    8. 最后的result = [[6], [4,7], [1,3,5,8]]

    正确代码:

    1. from collections import deque
    2. # Definition for a binary tree node.
    3. # class TreeNode:
    4. # def __init__(self, val=0, left=None, right=None):
    5. # self.val = val
    6. # self.left = left
    7. # self.right = right
    8. class Solution:
    9. def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
    10. res = []
    11. if root == None:
    12. return res
    13. else:
    14. queue = deque([root])
    15. #只要queue非空,就要一直操作
    16. while queue:
    17. level = []
    18. #通过queue的长度控制弹出的个数
    19. for _ in range(len(queue)):
    20. node = queue.popleft()
    21. level.append(node.val)
    22. if node.left:
    23. queue.append(node.left)
    24. if node.right:
    25. queue.append(node.right)
    26. #把level的结果都放到res里面
    27. res.append(level)
    28. return res

    时间空间复杂度:

    时间复杂度为O(n),其中n为二叉树中的节点个数,因为每个节点都会被访问一次。

    空间复杂度为O(m),其中m为二叉树中每一层的最大节点个数,即为队列`queue`的最大长度。

    二叉树的层序遍历(LC107):

    算法:就是把LC102复现以后,把结果反转一下

    代码:

    1. from collections import deque
    2. # Definition for a binary tree node.
    3. # class TreeNode:
    4. # def __init__(self, val=0, left=None, right=None):
    5. # self.val = val
    6. # self.left = left
    7. # self.right = right
    8. class Solution:
    9. def levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:
    10. res = []
    11. if root == None:
    12. return res
    13. else:
    14. queue = deque([root])
    15. #只要queue非空,就要一直操作
    16. while queue:
    17. level = []
    18. #通过queue的长度控制弹出的个数
    19. for _ in range(len(queue)):
    20. node = queue.popleft()
    21. level.append(node.val)
    22. if node.left:
    23. queue.append(node.left)
    24. if node.right:
    25. queue.append(node.right)
    26. #把level的结果都放到res里面
    27. res.append(level)
    28. res [:] = res [::-1]
    29. return res

    时间空间复杂度:

    这段代码的时间复杂度为O(n),其中n为二叉树中的节点个数,因为每个节点都会被访问一次。空间复杂度为O(m),其中m为二叉树中每一层的最大节点个数,即为双端队列`queue`的最大长度。

  • 相关阅读:
    IIS解析漏洞复现
    Gather-Excite Attention
    【OpenCV实现图像:使用OpenCV进行物体轮廓排序】
    快速入门:如何使用HTTP代理进行网络请求
    ERP编制物料清单 金蝶
    软件设计模式系列之十四——代理模式
    Python手写人脸识别
    1100w播放、45w涨粉!黑马UP在B站20天逆袭登顶!
    Datawhale学习笔记AI +新能源:电动汽车充电站充电量预测
    微信小程序开发实战6_1 小程序登录
  • 原文地址:https://blog.csdn.net/m0_50696252/article/details/134325948