【剑指offer】JZ32 从上往下打印二叉树

1 问题

不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印,跳过),请你将打印的结果存放到一个数组里面,返回。

在这里插入图片描述
数据范围:0<=节点总数<=1000,-1000<=节点值<=1000

示例1
输入:{8,6,10,#,#,2,1}
返回值:[8,6,10,2,1]

示例2
输入:{5,4,#,3,#,2,#,1}
返回值:[5,4,3,2,1]

2 答案

自己写的,利用队列

import queue
class Solution:
    def PrintFromTopToBottom(self , root: TreeNode) -> List[int]:
        res = []
        q = queue.Queue()
        q.put(root)
        while not q.empty():
            node = q.get()
            # if node != None:  # 或者这个
            if node:
                res.append(node.val)
                q.put(node.left)
                q.put(node.right)
        return res
  1. 层次遍历(队列)
  • step 1:首先判断二叉树是否为空,空树没有遍历结果。
  • step 2:建立辅助队列,根节点首先进入队列。不管层次怎么访问,根节点一定是第一个,那它肯定排在队伍的最前面。
  • step 3:每次遍历队首节点,如果它们有子节点,依次加入队列排队等待访问。
import queue
class Solution:
    def PrintFromTopToBottom(self, root: TreeNode) -> List[int]:
        res = []
        if not root:
            # 如果是空,则直接返回空数组
            return res
        # 队列存储,进行层次遍历
        q = queue.Queue()
        q.put(root)
        while not q.empty():
            cur = q.get()
            res.append(cur.val)
            # 若是左右孩子存在,则存入左右孩子作为下一个层次
            if cur.left:
                q.put(cur.left)
            if cur.right:
                q.put(cur.right)
        return res
  1. 递归
  • 终止条件: 遍历到了空节点,就不再继续,返回。
  • 返回值: 将加入的输出数组中的结果往上返回。(再下一层递归函数调用中输入res,也算是一种return)
  • 本级任务: 处理按照上述思路处理非空节点,并进入该节点的子节点作为子问题。

具体做法:

  • step 1:首先判断二叉树是否为空,空树没有遍历结果。
  • step 2:使用递归进行层次遍历输出,每次递归记录当前二叉树的深度,每当遍历到一个节点,如果为空直接返回。
  • step 3:如果遍历的节点不为空,输出二维数组中一维数组的个数(即代表了输出的行数)小于深度,说明这个节点应该是新的一层,我们在二维数组中增加一个一维数组,然后再加入二叉树元素。
  • step 4:如果不是step 3的情况说明这个深度我们已经有了数组,直接根据深度作为下标取出数组,将元素加在最后就可以了。
  • step 5:处理完这个节点,再依次递归进入左右节点,同时深度增加。因为我们进入递归的时候是先左后右,那么遍历的时候也是先左后右,正好是层次遍历的顺序。
  • step 6:最后将二维数组中的结果依次送入一维数组。
class Solution:
    def traverse(self, root: TreeNode, temp: List[List[int]], depth: int):
        if root:
            if len(temp) < depth:
                row = []
                temp.append(row)
            else:
                row = temp[depth-1] # 如果走这个,下面对row append时,temp[depth-1] 也会append一个相同的值,即也会对temp进行修改,因为列表是可变对象,如果想要不修改temp,可以使用浅拷贝 row = temp[:]
            row.append(root.val)
            self.traverse(root.left, temp, depth+1)
            self.traverse(root.right, temp, depth+1)

    def PrintFromTopToBottom(self, root: TreeNode) -> List[int]:
        res = []
        temp = []
        if not root:
            return res
        self.traverse(root, temp, 1)
        for i in range(len(temp)):
            res += temp[i]
        return res

https://www.nowcoder.com/share/jump/9318638301698667094710

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LouHerGetUp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值