@@ -7,24 +7,31 @@ def initialize(values = [])
7
7
values . each { |value | insert ( value ) } if values . any?
8
8
end
9
9
10
- def insert ( value )
11
- insert_helper ( value )
12
- end
13
-
14
10
def print
15
11
puts inorder ( @root ) . to_s
16
12
end
17
13
18
- def insert_helper ( value , node = @root )
14
+ def insert ( value , node = @root )
19
15
if node . nil?
20
16
node = TreeNode . new ( value )
21
17
@root = node if @root . nil?
22
18
return node
23
19
end
24
20
if value < node . val
25
- node . left . nil? ? node . left = TreeNode . new ( value ) : insert_helper ( value , node . left )
21
+ node . left = insert ( value , node . left )
26
22
elsif value > node . val
27
- node . right . nil? ? node . right = TreeNode . new ( value ) : insert_helper ( value , node . right )
23
+ node . right = insert ( value , node . right )
24
+ end
25
+ node
26
+ end
27
+
28
+ def search ( val , node = @root )
29
+ return false if node . nil?
30
+
31
+ case val <=> node . val
32
+ when 1 then search ( val , node . right )
33
+ when -1 then search ( val , node . left )
34
+ when 0 then true
28
35
end
29
36
end
30
37
@@ -36,9 +43,62 @@ def inorder(node, output = [])
36
43
inorder ( node . right , output )
37
44
output
38
45
end
46
+
47
+ def min ( node = @root )
48
+ return nil if node . nil?
49
+
50
+ current = node
51
+ while current
52
+ min = current . val
53
+ current = current . left
54
+ end
55
+ min
56
+ end
57
+
58
+ def max ( node = @root )
59
+ return nil if node . nil?
60
+
61
+ current = node
62
+ while current
63
+ max = current . val
64
+ current = current . right
65
+ end
66
+ max
67
+ end
68
+
69
+ def delete ( val , node = @root )
70
+ return if node . nil?
71
+
72
+ if val < node . val
73
+ node . left = delete ( val , node . left )
74
+ elsif val > node . val
75
+ node . right = delete ( val , node . right )
76
+ elsif node . left . nil? && node . right . nil?
77
+ # leaf node
78
+ return nil
79
+ elsif node . left . nil? # only left child
80
+ return node . right
81
+ elsif node . right . nil? # only right child
82
+ return node . left
83
+ else
84
+ # both left and right subtree
85
+ replacement = min ( node . right )
86
+ node . val = replacement
87
+ node . right = delete ( replacement , node . right )
88
+ return node
89
+
90
+ end
91
+ node
92
+ end
39
93
end
40
94
41
- bst = BST . new ( [ 4 , 33 , 4 , 5 , 6 , 42 , 7 ] )
95
+ bst = BST . new ( [ 10 , 2 , 33 , 4 , 5 , 3 , 42 ] )
42
96
bst . print
43
97
44
- puts bst . root . to_s
98
+ # puts bst.search(4)
99
+ # puts bst.min
100
+
101
+ # puts bst.max
102
+
103
+ puts bst . delete ( 4 )
104
+ puts bst . print
0 commit comments