1
+ function BinarySearchTree ( ) {
2
+
3
+ var Node = function ( key ) {
4
+ this . key = key ;
5
+ this . left = null ;
6
+ this . right = null ;
7
+ } ;
8
+
9
+ var root = null ;
10
+
11
+ this . insert = function ( key ) {
12
+
13
+ var newNode = new Node ( key ) ;
14
+
15
+ //special case - first element
16
+ if ( root === null ) {
17
+ root = newNode ;
18
+ } else {
19
+ insertNode ( root , newNode ) ;
20
+ }
21
+ } ;
22
+
23
+ var insertNode = function ( node , newNode ) {
24
+ if ( newNode . key < node . key ) {
25
+ if ( node . left === null ) {
26
+ node . left = newNode ;
27
+ } else {
28
+ insertNode ( node . left , newNode ) ;
29
+ }
30
+ } else {
31
+ if ( node . right === null ) {
32
+ node . right = newNode ;
33
+ } else {
34
+ insertNode ( node . right , newNode ) ;
35
+ }
36
+ }
37
+ } ;
38
+
39
+ this . getRoot = function ( ) {
40
+ return root ;
41
+ } ;
42
+
43
+ this . search = function ( key ) {
44
+
45
+ return searchNode ( root , key ) ;
46
+ } ;
47
+
48
+ var searchNode = function ( node , key ) {
49
+
50
+ if ( node === null ) {
51
+ return false ;
52
+ }
53
+
54
+ if ( key < node . key ) {
55
+ return searchNode ( node . left , key ) ;
56
+
57
+ } else if ( key > node . key ) {
58
+ return searchNode ( node . right , key ) ;
59
+
60
+ } else { //element is equal to node.item
61
+ return true ;
62
+ }
63
+ } ;
64
+
65
+ this . inOrderTraverse = function ( callback ) {
66
+ inOrderTraverseNode ( root , callback ) ;
67
+ } ;
68
+
69
+ var inOrderTraverseNode = function ( node , callback ) {
70
+ if ( node !== null ) {
71
+ inOrderTraverseNode ( node . left , callback ) ;
72
+ callback ( node . key ) ;
73
+ inOrderTraverseNode ( node . right , callback ) ;
74
+ }
75
+ } ;
76
+
77
+ this . preOrderTraverse = function ( callback ) {
78
+ preOrderTraverseNode ( root , callback ) ;
79
+ } ;
80
+
81
+ var preOrderTraverseNode = function ( node , callback ) {
82
+ if ( node !== null ) {
83
+ callback ( node . key ) ;
84
+ preOrderTraverseNode ( node . left , callback ) ;
85
+ preOrderTraverseNode ( node . right , callback ) ;
86
+ }
87
+ } ;
88
+
89
+ this . postOrderTraverse = function ( callback ) {
90
+ postOrderTraverseNode ( root , callback ) ;
91
+ } ;
92
+
93
+ var postOrderTraverseNode = function ( node , callback ) {
94
+ if ( node !== null ) {
95
+ postOrderTraverseNode ( node . left , callback ) ;
96
+ postOrderTraverseNode ( node . right , callback ) ;
97
+ callback ( node . key ) ;
98
+ }
99
+ } ;
100
+
101
+ this . min = function ( ) {
102
+ return minNode ( root ) ;
103
+ } ;
104
+
105
+ var minNode = function ( node ) {
106
+ while ( node && node . left !== null ) {
107
+ node = node . left ;
108
+ }
109
+
110
+ return node . key ;
111
+ } ;
112
+
113
+ this . max = function ( ) {
114
+ return maxNode ( root ) ;
115
+ } ;
116
+
117
+ var maxNode = function ( node ) {
118
+ while ( node && node . right !== null ) {
119
+ node = node . right ;
120
+ }
121
+
122
+ return node . key ;
123
+ } ;
124
+
125
+ this . remove = function ( element ) {
126
+ root = removeNode ( root , element ) ;
127
+ } ;
128
+
129
+ var findMinNode = function ( node ) {
130
+ while ( node && node . left !== null ) {
131
+ node = node . left ;
132
+ }
133
+
134
+ return node ;
135
+ } ;
136
+
137
+ var removeNode = function ( node , element ) {
138
+
139
+ if ( node === null ) {
140
+ return null ;
141
+ }
142
+
143
+ if ( element < node . key ) {
144
+ node . left = removeNode ( node . left , element ) ;
145
+ return node ;
146
+
147
+ } else if ( element > node . key ) {
148
+ node . right = removeNode ( node . right , element ) ;
149
+ return node ;
150
+
151
+ } else { //element is equal to node.item
152
+
153
+ //handle 3 special conditions
154
+ //1 - a leaf node
155
+ //2 - a node with only 1 child
156
+ //3 - a node with 2 children
157
+
158
+ //case 1
159
+ if ( node . left === null && node . right === null ) {
160
+ node = null ;
161
+ return node ;
162
+ }
163
+
164
+ //case 2
165
+ if ( node . left === null ) {
166
+ node = node . right ;
167
+ return node ;
168
+
169
+ } else if ( node . right === null ) {
170
+ node = node . left ;
171
+ return node ;
172
+ }
173
+
174
+ //case 3
175
+ var aux = findMinNode ( node . right ) ;
176
+ node . key = aux . key ;
177
+ node . right = removeNode ( node . right , aux . key ) ;
178
+ return node ;
179
+ }
180
+ } ;
181
+ }
0 commit comments