leetcode 第102题 二叉树的层次遍历, 第103题二叉树的锯齿形层次遍历, 第107题 二叉树的层次遍历 II
问题分析
这三道题都考察的都是二叉树的广度优先遍历,二叉树的广度优先遍历非常明显,就是按照顺序输出每一层的节点。这三题都是一个套路,同一种方法只要做一点修改就行了。
102 题 二叉树的层次遍历
这一题是为了按照顺序输出给定二叉树的每一层节点的值,其中每一层的值作为一个数组。具体题目见下:
解法是先用一个列表temp保存根节点,然后循环判断temp是否为空。如果不为空,就先将temp中节点的值全部加入到返回数组中。接下来就开始遍历该列表,如果列表的左右节点存在,就加入新生成的子节点列表中,这样遍历后,将子节点列表赋值为temp,接着循环。
这种解法并没有使用递归,所以要快一点。
103题 二叉树的锯齿形层次遍历
该题和102题比较相似,就是从上到下按层输出节点的值,但不同的是每层输出的值顺序不一样。
这一题针对102题的解法只要做一点改动就好了,上题中在加入每一层节点值的时候,要注意加入的顺序,即是顺序加入还是倒序加入。
107题 二叉树的层次遍历 II
107题的输出和102题的正好相反,所以直接将102题的结果逆序输出即满足题意。
但是我写了另外一种解法,是使用递归来解题。即先设置数组temp=[root],然后写递归函数来遍历temp,如果temp中的节点由左右儿子,那么加入新的数组。这样遍历结束后,判断儿子节点数组是否包含元素,如果有,那么将儿子数组代入递归函数中,继续递归。如果没有,说明当前数组已经是叶子节点了,那么将数组所有节点的值加入返回数组,并退出当前函数 ,返回上层函数。
源码
102 题 二叉树的层次遍历
class Solution:
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
ret = []
if not root:
return ret
temp = [root]
while temp:
son = []
ret.append([node.val for node in temp])
for node in temp:
if node.left:
son.append(node.left)
if node.right:
son.append(node.right)
temp = son
return ret
103题 二叉树的锯齿形层次遍历
class Solution:
def zigzagLevelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
ret = []
if not root:
return ret
flag = True
nodeList = [root]
while nodeList:
temp = []
if flag:
ret.append([node.val for node in nodeList])
else:
ret.append([node.val for node in nodeList[::-1]])
for node in nodeList:
if node.left:
temp.append(node.left)
if node.right:
temp.append(node.right)
nodeList = temp
flag = not flag
return ret
107题 二叉树的层次遍历 II
class Solution:
def levelOrderBottom(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
ret = []
# 这里使用广度优先遍历并加上头递归(先递归,后操作)
def bfs(level):
son = []
for node in level:
if node.left:
son.append(node.left)
if node.right:
son.append(node.right)
if son:
bfs(son)
ret.append([node.val for node in level])
return
if root:
bfs([root])
return ret