-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbst.rb
More file actions
79 lines (55 loc) · 1.71 KB
/
bst.rb
File metadata and controls
79 lines (55 loc) · 1.71 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
require_relative 'node'
require_relative 'crawler'
class Bst
attr_accessor :root
def initialize(keys, array_is_sorted=false)
array_is_sorted ? @root = build_balanced_tree(keys, 0, (keys.count-1)) : build_tree(keys)
puts "Binary Search Tree Prepped!"
end
def build_balanced_tree(keys, start_idx, end_idx)
#puts "keys at the start of build_tree are #{keys.to_s}"
return nil if start_idx > end_idx
mid = (start_idx + end_idx)/2
root = Node.new(keys[mid])
root.left = build_balanced_tree(keys, start_idx, mid-1)
root.right = build_balanced_tree(keys, mid+1, end_idx)
return root
end
def build_tree(keys)
@root = Node.new(keys.first)
#puts "The root of the tree is #{@root.key} from #{keys.first}"
keys[1..-1].each do |key|
#puts "Build tree is putting key #{key}"
put(key)
end
end
def put(key, node=@root)
#puts "Inside put, key #{key} is being added to node #{node.key}"
if key < node.key
#puts "Put has decided that #{key} is less than #{node.key}"
node.child_left? ? put(key, node.left) : node.add_child_left(key)
elsif key > node.key
#puts "Put has decided that #{key} is greater than #{node.key}"
node.child_right? ? put(key, node.right) : node.add_child_right(key)
else
#puts "Put has decided that the two keys are the same."
node.key = key
end
end
def to_s
@root.to_s
end
end
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
tree = Bst.new(arr, true)
arr2 = [1, 7, 4, 23, 8, 9, 4, 3, 5, 7, 9, 67, 6345, 324]
tree2 = Bst.new(arr2)
c = Crawler.new(tree2)
puts c.bfs(6345)
puts c.bfs(8)
puts c.dfs(6345)
puts c.dfs(8)
c = Crawler.new(tree2)
c.dfs_rec(67)
c = Crawler.new(tree2)
c.dfs_rec(324)