binary tree level order traversal

Binary Tree Level Order Traversal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
"""
Definition of TreeNode:
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
"""

import collections

class :
"""
@param root: A Tree
@return: Level order a list of lists of integer
"""
def levelOrder(self, root):

#ans = []
#self.levelOrderDFS(root, 0, ans)
return self.levelOrderBFSNonePointer(root)

def levelOrderDFS(self, root, level, ans):
if root:
if len(ans) < level + 1:
ans.append([])
ans[level].append(root.val)
if root.left:
self.levelOrderDFS(root.left, level + 1, ans)
if root.right:
self.levelOrderDFS(root.right, level + 1, ans)

def levelOrderBFS(self, root):
if root is None:
return []

queue = collections.deque([root])
result = []
while queue:
level = []
for _ in range(len(queue)):
node = queue.popleft()
level.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
result.append(level)
return result

def levelOrderBFSDoubleQueue(self, root):
if root is None:
return []

queue1, queue2 = collections.deque([root]), collections.deque()
result = []
level = 0
while queue1 or queue2:
while queue1:
if len(result) < level + 1:
result.append([])
head = queue1.popleft()
result[level].append(head.val)
if head.left:
queue2.append(head.left)
if head.right:
queue2.append(head.right)
level += 1
queue1.extend(queue2)
queue2.clear()

return result

def levelOrderBFSNonePointer(self, root):
if root is None:
return []

queue = collections.deque([root, None])
result = []
level = 0
while len(queue) > 1:
if len(result) < level + 1:
result.append([])
head = queue.popleft()
if head == None:
queue.append(None)
level += 1
continue
result[level].append(head.val)
if head.left:
queue.append(head.left)
if head.right:
queue.append(head.right)
return result