1.要求
二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
2.思想及代码
思想就是BFS层次遍历。就是将节点放入列表中,然后弹出看它是否有子节点,有子节点再把子节点加入列表,再把每个值放入列表中,最终再放入最终的列表res中。
例如 [3,5,4] ,第一次 p=[root] len§不为0, 向下执行 ,中间列表 tmp=[] ,然后根据当前p中的个数执行for循环(这里就是将每层的元素放入tmp列表中),当前只有一个执行一次for 循环,然后执行p.pop(0),然后 p=[],判断是否有子节点有两个子节点5,4 然后p中有两个子节点。tmp.append(3) 执行完后for循环后,res.append( [3] ),res=[[3]]。第二次,p中有两个子节点。会执行两遍将 5,4将入到tmp 中去。最后tmp=[5,4],res=[[3],[5,4]]。大概的过程就是这样。
广度优先搜索的代码
if root==None:
return []
tmp=[root]
res=[root.val]
while tmp:
t=tmp.pop(0)
if t.left:
res.append(t.left.val)
tmp.append(t.left)
if t.right:
res.append(t.right.val)
tmp.append(t.right)
print(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]]:
res = []
if not root:
return res
p = []
p.append(root)
while len(p) != 0:
tmp = []
for i in range(len(p)):
r = p.pop(0)
if r.left:
p.append(r.left)
if r.right:
p.append(r.right)
tmp.append(r.val)
res.append(tmp)
return res