1 问题
不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印,跳过),请你将打印的结果存放到一个数组里面,返回。
数据范围:0<=节点总数<=1000,-1000<=节点值<=1000
示例1
输入:{8,6,10,#,#,2,1}
返回值:[8,6,10,2,1]
示例2
输入:{5,4,#,3,#,2,#,1}
返回值:[5,4,3,2,1]
2 答案
自己写的,利用队列
import queue
class Solution:
def PrintFromTopToBottom(self , root: TreeNode) -> List[int]:
res = []
q = queue.Queue()
q.put(root)
while not q.empty():
node = q.get()
# if node != None: # 或者这个
if node:
res.append(node.val)
q.put(node.left)
q.put(node.right)
return res
- 层次遍历(队列)
- step 1:首先判断二叉树是否为空,空树没有遍历结果。
- step 2:建立辅助队列,根节点首先进入队列。不管层次怎么访问,根节点一定是第一个,那它肯定排在队伍的最前面。
- step 3:每次遍历队首节点,如果它们有子节点,依次加入队列排队等待访问。
import queue
class Solution:
def PrintFromTopToBottom(self, root: TreeNode) -> List[int]:
res = []
if not root:
# 如果是空,则直接返回空数组
return res
# 队列存储,进行层次遍历
q = queue.Queue()
q.put(root)
while not q.empty():
cur = q.get()
res.append(cur.val)
# 若是左右孩子存在,则存入左右孩子作为下一个层次
if cur.left:
q.put(cur.left)
if cur.right:
q.put(cur.right)
return res
- 递归
- 终止条件: 遍历到了空节点,就不再继续,返回。
- 返回值: 将加入的输出数组中的结果往上返回。(再下一层递归函数调用中输入res,也算是一种return)
- 本级任务: 处理按照上述思路处理非空节点,并进入该节点的子节点作为子问题。
具体做法:
- step 1:首先判断二叉树是否为空,空树没有遍历结果。
- step 2:使用递归进行层次遍历输出,每次递归记录当前二叉树的深度,每当遍历到一个节点,如果为空直接返回。
- step 3:如果遍历的节点不为空,输出二维数组中一维数组的个数(即代表了输出的行数)小于深度,说明这个节点应该是新的一层,我们在二维数组中增加一个一维数组,然后再加入二叉树元素。
- step 4:如果不是step 3的情况说明这个深度我们已经有了数组,直接根据深度作为下标取出数组,将元素加在最后就可以了。
- step 5:处理完这个节点,再依次递归进入左右节点,同时深度增加。因为我们进入递归的时候是先左后右,那么遍历的时候也是先左后右,正好是层次遍历的顺序。
- step 6:最后将二维数组中的结果依次送入一维数组。
class Solution:
def traverse(self, root: TreeNode, temp: List[List[int]], depth: int):
if root:
if len(temp) < depth:
row = []
temp.append(row)
else:
row = temp[depth-1] # 如果走这个,下面对row append时,temp[depth-1] 也会append一个相同的值,即也会对temp进行修改,因为列表是可变对象,如果想要不修改temp,可以使用浅拷贝 row = temp[:]
row.append(root.val)
self.traverse(root.left, temp, depth+1)
self.traverse(root.right, temp, depth+1)
def PrintFromTopToBottom(self, root: TreeNode) -> List[int]:
res = []
temp = []
if not root:
return res
self.traverse(root, temp, 1)
for i in range(len(temp)):
res += temp[i]
return res
https://www.nowcoder.com/share/jump/9318638301698667094710