《剑指Offer》-- 分行从上往下打印二叉树(学会使用队列进行广度优先遍历,Python)

题目:

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

分析:

不管是广度优先遍历一副有向图还是一棵树,都要用到队列。首先把起始节点(对树而言是根节点)放入队列。接下来每次从队列的头部取出一个节点,遍历这个节点之后把它能够到达的节点(对树而言是子节点)都依次放入队列。重复这个遍历过程,知道队列中所有节点都被遍历为止。

为了把二叉树的每一行单独打印到一行,我们需要两个变量:

1、表示在当前层中还没有打印的节点数

2、表示下一层节点的数目

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

def PrintAsLevel(root):
    if not root:
        return []
    
    # 定义队列,这里用列表表示,出队的时候使用list().pop(0), 进队的时候使用list().append()
    # 添加根节点进队以初始化队列
    Queue = []
    Queue.append(root)
    layerVal = []        # 每一层要打印的节点值
    Vals = []            # 最终输出
    
    # 定义两个变量toBePrinted和nextLevel
    # toBePrinted,表示当前层中还没有打印的节点数
    # nextLevel,表示下一层的节点数
    toBePrinted = 1
    nextLevel = 0
    
    while len(Queue):
        node = Queue.pop(0)
        toBePrinted -= 1
        layerVal.append(node.val)

        # 如果有子节点,则入队
        if node.left:
            Queue.append(node.left)
        if node.right:
            Queue.append(node.right)
        
        # 如果当前层已经打印完,则进入下一层
        if toBePrinted == 0:
            toBePrinted, nextLevel = nextLevel, 0
            Vals.append(layerVal)
            layerVal = []
    
    return Vals

测试与结果:

root = TreeNode(8)
a = TreeNode(6)
b = TreeNode(10)
c = TreeNode(5)
d = TreeNode(7)
e = TreeNode(9)
f = TreeNode(11)
g = TreeNode(12)
h = TreeNode(13)

root.left = a
root.right = b
a.left = c
a.right = d
b.left = e
b.right = f
d.left = g
d.right = h

print(PrintAsLevel(root))    # [[8], [6, 10], [5, 7, 9, 11], [12, 13]]

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值