原题
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree[3,9,20,null,null,15,7]
,3 / 9 20 / 15 7return its zigzag level order traversal as:
[ [3], [20,9], [15,7] ]
解题方法
方法一
- 利用栈来实现,将每一层的节点压入栈中,然后通过迭代遍历出每一层节点中的值并加入答案中,通过取模2判断是否正序或逆序
# 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 zigzagLevelOrder(self, root): """ :type root: TreeNode :rtype: List[List[int]] """ if root == None: return [] stack, ret = [root], [] dep = 0 while stack: level_value = [] next_level = [] for node in stack: level_value.append(node.val) if node.left: next_level.append(node.left) if node.right: next_level.append(node.right) if dep % 2 == 0: ret.append(level_value) else: ret.append(level_value[::-1]) stack = next_level dep += 1 return ret
方法二
- 利用双向队列求解,解题思路跟方法一类似
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None # 利用双向队列 # Your runtime beats 90.20 % of python submissions. class Solution(object): def zigzagLevelOrder(self, root): """ :type root: TreeNode :rtype: List[List[int]] """ if root == None: return [] DQ = collections.deque() DQ.append(root) ret = [] flag = True while DQ: length = len(DQ) level_value = [] for i in xrange(length): node = DQ.popleft() if node.left: DQ.append(node.left) if node.right: DQ.append(node.right) if flag: level_value.append(node.val) else: level_value = [node.val] + level_value ret.append(level_value) flag = not flag return ret