给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
这道题既可以用DFS,也可以用BFS,但是BFS需要单独划分出来哪些是同一层的元素。
DFS:
class Solution:
def seekall(self,level,root:TreeNode):
self.map_c[level].append(root.val)
if root.left != None:
self.seekall(level+1,root.left)
if root.right != None:
self.seekall(level+1,root.right)
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if root == None:
return []
self.map_c = []
self.res=[]
for i in range(1000):
self.map_c.append([])
self.seekall(0,root)
for i in self.map_c:
if i:
self.res.append(i)
return self.res
BFS:
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
que=[]
res=[]
if root == None:
return []
que.append(root)
while(que != []):
length=len(que)
ans=[]
for i in range(length):
node=que.pop(0)
ans.append(node.val)
if node.left:que.append(node.left)
if node.right:que.append(node.right)
res.append(ans)
return res
在BFS中,关键是计算好哪些节点但是同一层的节点,用两层循环,内层的循环只循环当前层次的节点的个数,
即只会将当前层次的节点出栈,不会影响下一层,正好当内层循环结束的时候,que队列中只剩下下一层的所有节点。
BFS核心代码段
while(que != []):
length=len(que) #先算出来每层的个数,方便下层的for循环控制循环次数。
ans=[]
for i in range(length):
node=que.pop(0) # 每次将弹出的节点赋给node,然后再进行操作
ans.append(node.val)
if node.left:que.append(node.left)
if node.right:que.append(node.right)
res.append(ans)