宽度优先打印二叉树

题目描述

1.从上往下打印出二叉树的每个节点,同层节点从左至右打印。([1,2,3,4,5,6,],无需保存行号)

2.有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。([[1][2,3],[4,5,6]],按照层数打印)

给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。

 按照层数打印二叉树,需要保证每一层打印完之后再打印其对应的子节点。我们可以采用队列结构,将当前层(父节点)入队,每出队一个便打印出来,同时将其子节点入队。若在打印时保存树的深度,保持原来的相对形状打印(2),需要记录换行处。我们可以使用两个指针,一个指向换行处节点last,另一个指向最近添加的节点now。如果pop的节点==其换行处节点,则更新换行节点为下一行的换行节点=now。具体操作:

1.初始化时,last=1,把1放入队列;

2.将1出队,把1的子孩子2,3放入队列,更新now=3;

3.nlast更新完之后,打印上一次出队的1,并和last比较,如果相同就打印换行,并更新last=now=3;

4.将2出队,把2的子孩子4放入队列,更新now=4;

5,nlast更新完以后,打印上一次出队的2,并和last(3)比较,不相同,continue;

6.将3出队,将3的子孩子5,6放入队列,更新now=6;

7.nlast更新完以后,打印上一次出队的3,并和last(3)比较, 相同就打印换行,并更新last=now=6;

…………

总结就是如下循环:(初始化last=根节点,根节点入队)

while(队列不空)

1.将A出队,并将A的子孩子入队(判断是否存在再入队),更新now=A最后入队的子孩子;

2.打印上次出队的家伙A,并和last比较, 如果相同就打印换行,并更新last=now,如果 不相同,则continue

题目一:

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回从上到下每个节点值列表,例:[1,2,3]
    def PrintFromTopToBottom(self, root):
        last = root
        now = root
        if root is None:
            return []
        queue = []
        queue.insert(0,root)
        cur_line = []
        while len(queue):
            pop = queue.pop()
            cur_line.append(pop.val)
            if pop.left is not None:
                queue.insert(0,pop.left)
                now = queue[0]
            if pop.right is not None:
                queue.insert(0,pop.right)
                now = queue[0]
            if pop == last:
                last = now
        return cur_line

题目二: 

# -*- coding:utf-8 -*-

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class TreePrinter:
    def printTree(self, root):
        last = root
        now = root
        if root is None:
            return []
        queue = []
        queue.insert(0,root)
        cur_line = []
        res = []
        while queue:
            pop = queue.pop()
            cur_line.append(pop.val)
            if pop.left is not None:
                queue.insert(0,pop.left)
                now = queue[0]
            if pop.right is not None:
                queue.insert(0,pop.right)
                now = queue[0]
            if pop == last:
                last = now
                res.append(cur_line[:])
                cur_line = []
        return res

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值