1.从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
本题相当于层次遍历。使用python-collections中的队列。想法主要是利用队列存储,每次弹出结点的同时,存储其左右结点。做到按序进出队列。再用数组存储数值。
此时,队列直接存储的是结点,而不是结点的数值。
如果想从两端append数据,使用deque很方便,从两边append ,appendleft 数据。popleft弹出左边的数,pop弹出右边的。
from collections import deque
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
a = []
if not root:
return []
queue = collections.deque()
queue.append(root)
while queue:
pop = queue.popleft()
a.append(pop.val)
if pop.left:
queue.append(pop.left)
if pop.right:
queue.append(pop.right)
return a
2.从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
区别是每一层打印一行,即
做法:1.使用了两个队列,在第一个队列出完的时候把第二个队列的结点赋给第一个。相当于每一层的结点pop完,就把下一层的结点给第一个队列。一个中转的作用!
import collections
class Solution(object):
def levelOrder(self, root):
if not root:
return []
queue1 = collections.deque()
queue2 = collections.deque()
a = []
b = []
queue1.append(root)
while queue1 or queue2:
if not queue1:
while queue2:
queue1.append(queue2.popleft())
pop = queue1.popleft()
a.append(pop.val)
if pop.left:
queue2.append(pop.left)
if pop.right:
queue2.append(pop.right)
if not queue1:
b.append(a)
a = []
return b
2.方法二使用一个队列即可,是每一次开始pop和append新节点的之前,先计算出queue的大小,然后只pop出原来大小的结点。
下面的len随着queue的更新是不会更新的,只是在for下面的语句循环原来的计算的数值。
import collections
class Solution(object):
def levelOrder(self, root):
if not root:
return []
queue1 = collections.deque()
b = []
queue1.append(root)
while queue1 :
a = []
for i in range(0,len(queue1)):
pop = queue1.popleft()
a.append(pop.val)
if pop.left:
queue1.append(pop.left)
if pop.right:
queue1.append(pop.right)
b.append(a)
return b