数据结构【二叉树】| leetcode 102. 二叉树的层序遍历(中等)

理论参考链接:https://www.bilibili.com/video/BV1nJ411V7bd

对于一颗二叉树,从根结点开始,按从上到下、从左到右的顺序访问每一个结点,每一个结点仅仅访问一次。

在这里插入图片描述

算法设计思路:使用一个队列

  1. 将根结点进队
  2. 队不空时循环:从队列中出列一个结点*p,访问它;
    • 若它有左孩子结点,将左孩子结点进队;
    • 若它有右孩子结点,将右孩子结点进队。

二叉树的层次遍历示意图:
在这里插入图片描述

代码参考链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/solution/die-dai-di-gui-duo-tu-yan-shi-102er-cha-shu-de-cen/

队列用列表表示,弹出操作用pop(索引),弹出会有返回值。

# 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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        res = []
        queue = [root]  # 首先将根节点加入队列

        while queue:    # 当队列不为空时,进行循环
            size = len(queue)  # 查看当前队列长度
            temp = []  # 返回值为二维列表, 这里设置一个空列表, 用于res.append
            for _ in range(len(queue)):
                r = queue.pop(0)   # 弹出队首, pop操作会有返回值
                temp.append(r.val) # 将数值加入temp
                if r.left:   # 左节点不为空, 追加到队尾
                    queue.append(r.left)
                if r.right:  # 右节点不为空, 追加到队尾
                    queue.append(r.right)
            res.append(temp)
        return res

加一层for循环是为了结果输出二维数组。

带有输入输出的完整代码

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

# 通过层次遍历创建二叉树
class Tree():
    """二叉树"""
    def __init__(self):
        self.root = None

    def add(self, item):
        node = TreeNode(item)
        if self.root is None:
            self.root = node
            return
        queue = [self.root]

        while queue:
            # 节点指针,从第一个开始
            cur_node = queue.pop(0)
            # 如果左节点的子节点为None,就赋值给他;否则 末尾追加
            if cur_node.left is None:
                cur_node.left = node
                return
            else:
                queue.append(cur_node.left)
            if cur_node.right is None:
                cur_node.right = node
                return
            else:
                queue.append(cur_node.right)

def levelOrder(root):
    if not root:
        return []

    queue = [root]
    res = []
    while queue:
        temp = []
        for _ in range(len(queue)):
            r = queue.pop(0)
            if r.val is not None:
                temp.append(r.val)
            if r.left is not None:
                queue.append(r.left)
            if r.right is not None:
                queue.append(r.right)
        res.append(temp)
    return res


if __name__ == '__main__':
    tree = Tree()
    for i in [3,9,20,None,None,15,7]:
        tree.add(i)
    print(levelOrder(tree.root))
[[3], [9, 20], [15, 7]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值