第一题
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
3
/
9 20
/
15 7
[3,9,20,15,7]
if root == None: return []
res = []
queue = collections.deque()
queue.append(root)
while queue:
node = queue.popleft()
res.append(node.val)
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
return res
其实就是二叉树的层次遍历。
二叉树一共有四种遍历方式,前序遍历(我左右),中序遍历(左我右),后序遍历(左右我)和层次遍历。
只不过多了一个列表res。
第二题
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
[
[3],
[9,20],
[15,7]
]
if not root: return []
res = []
queue = collections.deque()
queue.append(root)
while queue:
tmp = []
for _ in range(len(queue)):
node = queue.popleft()
tmp.append(node.val)
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
res.append(tmp)
return res
1在第一题的基础上,把res.append()添加的东西 由数字变成列表
2列表的来源在于tmp,tmp的长度取决于for _ range(len(queue)) ,res每添加一次,for 循环的次数。
第三题
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
if not root: return []
res = []
queue = collections.deque()
queue.append(root)
while queue:
tmp = collections.deque()
for _ in range(len(queue)):
node = queue.popleft()
if len(res)%2: tmp.appendleft(node.val)
else: tmp.append(node.val)
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
res.append(list(tmp))
return res
改动3处
1tmp也变成双边队列
2本来是tmp.append(node.val)
变成 if len(res) % 2: tmp.appenleft(node.val) else: tmp.append(node.val) #正常添加
3res.append(tmp)
变成 res.append(list(tmp))