1
+ //A binary tree is a data structure in which an element has two successors(children)
2
+ //The left child is usually smaller than the parent, and the right child is usually bigger
3
+ class Node {
4
+ public int data ;
5
+ public Node left ;
6
+ public Node right ;
7
+ public Node parent ;
8
+
9
+ public Node (int value ){
10
+ data = value ;
11
+ left = null ;
12
+ right = null ;
13
+ parent = null ;
14
+ }
15
+ }
16
+
17
+ class Tree {
18
+ private Node root ;
19
+
20
+ public Tree (){
21
+ root = null ;
22
+ }
23
+ //Returns the node if it finds it, otherwise returns the parent
24
+ public Node find (int key ){
25
+ Node current = root ;
26
+ Node last = root ;
27
+ while (current != null ){
28
+ last = current ;
29
+ if (key < current .data )
30
+ current = current .left ;
31
+ else if (key > current .data )
32
+ current = current .right ;
33
+ //If you find the value return it
34
+ else
35
+ return current ;
36
+ }
37
+ return last ;
38
+ }
39
+
40
+ //Inserts the given value
41
+ public void put (int value ){
42
+ Node newNode = new Node (value );
43
+ if (root == null )
44
+ root = newNode ;
45
+ else {
46
+ //This will return the soon to be parent of the value you're inserting
47
+ Node parent = find (value );
48
+
49
+ //This if/else assigns the new node to be either the left or right child of the parent
50
+ if (value < parent .data ){
51
+ parent .left = newNode ;
52
+ parent .left .parent = parent ;
53
+ return ;
54
+ }
55
+ else {
56
+ parent .right = newNode ;
57
+ parent .right .parent = parent ;
58
+ return ;
59
+ }
60
+ }
61
+ }
62
+
63
+ //Deletes the given value
64
+ public boolean remove (int value ){
65
+ //temp is the node to be deleted
66
+ Node temp = find (value );
67
+
68
+ //If the value doesn't exist
69
+ if (temp .data != value )
70
+ return false ;
71
+
72
+ //No children
73
+ if (temp .right == null && temp .left == null ){
74
+ if (temp == root )
75
+ root = null ;
76
+
77
+ //This if/else assigns the new node to be either the left or right child of the parent
78
+ else if (temp .parent .data < temp .data )
79
+ temp .parent .right = null ;
80
+ else
81
+ temp .parent .left = null ;
82
+ return true ;
83
+ }
84
+
85
+ //Two children
86
+ else if (temp .left != null && temp .right != null ){
87
+ Node succesor = findSuccesor (temp );
88
+
89
+ //The left tree of temp is made the left tree of the successor
90
+ succesor .left = temp .left ;
91
+ succesor .left .parent = succesor ;
92
+
93
+ //If the successor has a right child, the child's grandparent is it's new parent
94
+ if (succesor .right != null && succesor .parent != temp ){
95
+ succesor .right .parent = succesor .parent ;
96
+ succesor .parent .left = succesor .right ;
97
+ succesor .right = temp .right ;
98
+ succesor .right .parent = succesor ;
99
+ }
100
+ if (temp == root ){
101
+ succesor .parent = null ;
102
+ root = succesor ;
103
+ return true ;
104
+ }
105
+
106
+ //If you're not deleting the root
107
+ else {
108
+ succesor .parent = temp .parent ;
109
+
110
+ //This if/else assigns the new node to be either the left or right child of the parent
111
+ if (temp .parent .data < temp .data )
112
+ temp .parent .right = succesor ;
113
+ else
114
+ temp .parent .left = succesor ;
115
+ return true ;
116
+ }
117
+ }
118
+ //One child
119
+ else {
120
+ //If it has a right child
121
+ if (temp .right != null ){
122
+ if (temp == root ){
123
+ root = temp .right ; return true ;}
124
+
125
+ temp .right .parent = temp .parent ;
126
+
127
+ //Assigns temp to left or right child
128
+ if (temp .data < temp .parent .data )
129
+ temp .parent .left = temp .right ;
130
+ else
131
+ temp .parent .right = temp .right ;
132
+ return true ;
133
+ }
134
+ //If it has a left child
135
+ else {
136
+ if (temp == root ){
137
+ root = temp .left ; return true ;}
138
+
139
+ temp .left .parent = temp .parent ;
140
+
141
+ //Assigns temp to left or right side
142
+ if (temp .data < temp .parent .data )
143
+ temp .parent .left = temp .left ;
144
+ else
145
+ temp .parent .right = temp .left ;
146
+ return true ;
147
+ }
148
+ }
149
+ }
150
+
151
+ //Move right once and go left down the tree as far as you can
152
+ public Node findSuccesor (Node n ){
153
+ if (n .right == null )
154
+ return n ;
155
+ Node current = n .right ;
156
+ Node parent = n .right ;
157
+ while (current != null ){
158
+ parent = current ;
159
+ current = current .left ;
160
+ }
161
+ return parent ;
162
+ }
163
+
164
+ public Node getRoot (){
165
+ return root ;
166
+ }
167
+
168
+ //Prints leftChild - root - rightChild
169
+ public void inOrder (Node localRoot ){
170
+ if (localRoot != null ){
171
+ inOrder (localRoot .left );
172
+ System .out .print (localRoot .data + " " );
173
+ inOrder (localRoot .right );
174
+ }
175
+ }
176
+ //Prints root - leftChild - rightChild
177
+ public void preOrder (Node localRoot ){
178
+ if (localRoot != null ){
179
+ System .out .print (localRoot .data + " " );
180
+ preOrder (localRoot .left );
181
+ preOrder (localRoot .right );
182
+ }
183
+ }
184
+ //Prints rightChild - leftChild - root
185
+ public void postOrder (Node localRoot ){
186
+ if (localRoot != null ){
187
+ postOrder (localRoot .left );
188
+ postOrder (localRoot .right );
189
+ System .out .print (localRoot .data + " " );
190
+ }
191
+ }
192
+ }
0 commit comments