-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathlever_order_traversal_tree.rb
More file actions
85 lines (69 loc) · 1.61 KB
/
lever_order_traversal_tree.rb
File metadata and controls
85 lines (69 loc) · 1.61 KB
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
class TreeNode
attr_accessor :val, :left, :right
def initialize(val = 0, left = nil, right = nil)
@val = val
@left = left
@right = right
end
end
def level_order_bfs(root)
return [] if root.nil?
visited = {}
queue = []
output = []
separator = '$'
visited[root.val] = true
# output << [root.val]
queue << root
queue << separator
output << [root.val]
level = []
while queue.any?
current = queue.shift
if current == separator
output << level if level.any?
queue << separator if queue.any?
level = []
next
end
unless current.left.nil?
visited[current.left.val] = true
queue << current.left
level << current.left.val
end
next if current.right.nil?
visited[current.right.val] = true
queue << current.right
level << current.right.val
end
output
end
def tree_height(node)
return 0 if node.left.nil? && node.right.nil?
lheight = tree_height(node.left)
rheight = tree_height(node.right)
[rheight, lheight].compact.max + 1
end
def printLevelOrder(node)
return [] if node.nil?
height = tree_height(node)
output = []
(0..height).each do |level|
output << get_level(node, level).flatten.compact
end
output
end
def get_level(node, level)
return [] if node.nil?
return [node.val] if level.zero?
[get_level(node.left, level - 1) +
get_level(node.right, level - 1)]
end
root = TreeNode.new(3)
root.left = TreeNode.new(9)
right = TreeNode.new(20)
right.left = TreeNode.new(15)
right.right = TreeNode.new(7)
root.right = right
# puts level_order_bfs(root).to_s
puts printLevelOrder(root).to_s