这道题我最开始的思路是直接将树用层序遍历输出,得到没有zigzag过的层序遍历结果,然后再对这个结果进行处理,将从右向左的行,通过python的逆向切片操作[::-1]来得到最后的结果。不过后来想了一下,在层序遍历时,就可以知道哪一行是向左,哪一行是向右,所以直接在层序遍历时处理即可。
最终思路:
首先是层序遍历。定义两个队列,一个是queue一个是nextqueue,因为需要区分不同的层,所以需要定义两个队列。这里需要注意的是区分不同层的方法。将当前层存储在queue中,下一层存储在nextqueue中,遍历queue中的节点的时候,将该节点的left和right子节点保存在nextqueue中,如果当前层遍历完成,那么就将nextqueue赋值到queue,将nextqueue置空。
在区分了不同层之后,就可以在每次切换层的时候,对方向指示变量dir进行改变。如果dir==1,那么就说明是向右,直接将本行的结果layerresult加入result,同时将dir置为-1即可,如果dir不是1,那么就说明是向左,将本行的结果逆向切片后,将layerresult[::-1]加入result,同时将dir置为1。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def solve(self, root):
result = []
result.append([root.val])
queue = []
nextqueue = []
if root.left is not None:
queue.append(root.left)
if root.right is not None:
queue.append(root.right)
dir = -1
while len(queue) != 0:
layerresult =[]
for node in queue:
# print(node.val)
layerresult.append(node.val)
if node.left is not None:
nextqueue.append(node.left)
if node.right is not None:
nextqueue.append(node.right)
if dir == 1:
dir = -1
result.append(layerresult)
else:
dir = 1
result.append(layerresult[::-1])
queue = nextqueue
nextqueue = []
return result
def zigzagLevelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if root is None:
return []
return self.solve(root)