Binary Tree Zigzag Level Order Traversal
Question
- leetcode: Binary Tree Zigzag Level Order Traversal | LeetCode OJ
- lintcode: (71) Binary Tree Zigzag Level Order Traversal
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).
Example
Given binary tree {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
题解1 - 队列
二叉树的广度优先遍历使用队列非常容易实现,这道题要求的是蛇形遍历,我们可以发现奇数行的遍历仍然可以按照广度优先遍历的方式实现,而对于偶数行,只要翻转一下就好了。
# Definition for a binary tree node
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# @param root, a tree node
# @return a list of lists of integers
def preorder(self, root, level, res):
if root:
if len(res) < level+1: res.append([])
if level % 2 == 0: res[level].append(root.val)
else: res[level].insert(0, root.val)
self.preorder(root.left, level+1, res)
self.preorder(root.right, level+1, res)
def zigzagLevelOrder(self, root):
res=[]
self.preorder(root, 0, res)
return res
# Definition for a binary tree node
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
# @param root, a tree node
# @return a list of lists of integers
def zigzagLevelOrder(self, root):
ret = []
def dfs(root, level):
if root:
if level >= len(ret):
ret.append([])
ret[level].append(root.val)
dfs(root.left, level + 1)
dfs(root.right, level + 1)
dfs(root, 0)
for i in xrange(1, len(ret), 2):
ret[i].reverse()
return ret