题目:
思路:二叉树的层级打印,最重要的就是多了一个层级,需要分层打印出来,这里的思路有两种,第一种是直接打印,第二种是递归打印。
层级遍历:
参考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