Leetcode - 广度优先遍历

本文详细介绍了二叉树的广度优先遍历算法,包括基础遍历过程和LeetCode上的一道经典练习题Binary Tree Level Order Traversal的解答。文中不仅解释了如何通过队列实现广度优先遍历,还给出了两种不同的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

> 基础


1. 广度遍历优先是从给定的root节点开始,逐层次的向下访问各个节点;

2. 实现的方式是通过队列的先进先出,将从root节点开始的左孩子和右孩子压入到队列中,并顺序取出;

3. 由于是用队列实现,因此不存在用递归实现的方式。


下面是基本的广度遍历优先算法:

def breadthFirstSearch(root):
    queue = []
    queue.append(root)
    while queue:
        node = queue[0]
        queue.pop(0)
        print ('%d ' % node.data)
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)

> Leetcode - Binary Tree Level Order Traversal

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example:
Given binary tree {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

return its level order traversal as:

[
  [3],
  [9,20],
  [15,7]
]
Note:这是一道二叉树的广度优先遍历练习题,不同之处在于要分辨出每个Node所在的深度,并给出每个深度所有Node的集合。解题思路有两种,一种是使用两个队列,分别为主队列和副队列,循环主队列里的所有节点,并把所有的孩子放在副队列中。这样当主队列为空时,把副队列赋给主队列,并清空副队列,就进入到下一级深度的循环。还有一种是使用flag,在root结点后加入flag,然后每次访问到flag的时候,就意味着访问到了该深度所有的Node,并且下一个深度的所有Node都加入到了队列中,这时再加入一个flag,依此循环。这里使用第二种方法。

Answer:

def levelOrder(root):
    if root is []:
        return []
    flag = TreeNode(65536)
    queue, line, res = [], [], []
    queue.append(root)
    queue.append(flag)
    while queue:
        node = queue[0]
        queue.pop(0)
        if node.val is not 65536:
            line.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        else:
            res.append(line)
            if not queue:
                return res
            queue.append(flag)
            line = []





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值