剑指offer--从上到下打印二叉树

题目:

思路:二叉树的层级打印,最重要的就是多了一个层级,需要分层打印出来,这里的思路有两种,第一种是直接打印,第二种是递归打印。

层级遍历:

参考k神,很多代码处理的太好了。这里他的层级打印为了打印出来每层,多用了一个for循环,循环的次数就是len(queue),queue里面存放的是当前层级的节点。队列可以使用两端队列或者普通列表来实现。

代码:

双端队列

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []#没有根节点就直接返回一个空列表
        res, queue=[],collections.deque()#使用自带的双端列表,可以更加节省时间
        queue.append(root)#将根节点添加到队列中去,后面可以通过判断队列的长度来进行分层打印
        while(queue):
            temp=[]#新建一个列表用来存储每一层的节点值,临时的
            for i in range(0,len(queue)):
                node=queue.popleft()#每次从队列中出来一个节点进行判断,有孩子节点就加到队列中去,进行下次的循环
                temp.append(node.val)#temp中存放当前层级的值
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            res.append(temp)#每一层值的分别加进来,就实现了分层
        return res

普通列表:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
         if not root:
            return []
        res, queue=[],[]
        queue.append(root)#将根节点添加到队列中去,后面可以通过判断队列的长度来进行分层打印
        while(queue):
            temp=[]#新建一个列表用来存储每一层的节点值
            for i in range(0,len(queue)):
                node=queue.pop(0)#每次从队列中出来一个节点进行判断
                temp.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            res.append(temp)
        return res

 思路二:递归算法

用了一个depth和当前res的长度比较,来建立一个新的列表存储现在层级的值

代码:


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

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
#递归打印
        if not root:
            return []
        res=[]
        def x1(root,depth):
            #第一层的depth=0,通过判断len(res)是否等于depth,
            #如果相等就说明明这一层的元素还没有添加进去,就创建一个新的位置让列表添加进去
            if len(res)==depth:
                res.append([])
            res[depth].append(root.val)
            if root.left:x1(root.left,depth+1)
            if root.right:x1(root.right,depth+1)
        x1(root,0)
        return res

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值