前言:剑指offer刷题系列
问题:
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
示例:
给定二叉树: [3,9,20,null,null,15,7],
思路:
这是一个遍历打印二叉树的题,需要知道python中树是如何存储的,树可以用列表存储和链表存储。
我首先判断根结点是否为空,如果为空,就不用判断了,可以直接返回空列表。第一次写没有考虑到这一点,后面才想到的。
若不为空,就创建一个队列queue,并将根结点入队,然后再创建一个结果列表,用来存储层序遍历的结果,当队列不为空时,可以执行以下操作:
创建一个临时列表temp,用来存储当前层的结点的值。然后就去获取队列的长度len(queue),用来表示当前层的结点个数。循环遍历队列中的结点,每次出队一个结点,并将其值添加到临时列表中。如果该结点有左孩子,就将左孩子入队。如果该结点有右孩子,就将右孩子入队。然后将临时列表添加到结果列表中。最后返回结果列表。
时间复杂度:O(n),其中 n 为二叉树的节点个数。 空间复杂度:O(n)。满二叉树(每一层都填满)最后一层有大约 n/2 个节点,因此数组中最多有 O(n)个元素,所以空间复杂度是 O(n) 的。
基于上述思考,代码如下:
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
queue = [root]
result = []
while queue:
temp = []
size = len(queue)
for _ in range(size):
node = queue.pop(0)
temp.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
result.append(temp)
return result
执行结果如下图:
学到的知识点:
学习了树在python中的表示,本题是通过节点和引用表示法:这种方法是用一个类来定义一个树节点,类中有三个属性:节点的值,左子树的引用,右子树的引用。这种方法更灵活,可以节省空间,因为只需要为每个节点分配一个对象的空间。