@@ -47,13 +47,14 @@ public boolean add(C value) {
4747 return false ;
4848
4949 final int before = size ;
50- if (root == null ) {
51- this .root = insert (null , null , value , 0 );;
52- } else {
50+ if (root == null )
51+ this .root = insert (null , null , value , 0 );
52+ else
5353 insert (null , root , value , 0 );
54- }
5554 final int after = size ;
56- return (before <after );
55+
56+ // Successful if the size has increased by one
57+ return (before ==(after -1 ));
5758 }
5859
5960 private Node insert (Node parent , Node node , C value , int idx ) {
@@ -99,38 +100,44 @@ public C remove(C value) {
99100 // Find the node
100101 final Node node = search (root , value , 0 );
101102
102- // If node was found, remove from tree
103- if (node != null ) {
104- if (node .isWord ) {
105- node .isWord = false ;
106- remove (node );
107- size --;
108- return value ;
109- }
110- }
111- return null ;
103+ // If node was not found or the node is not a "word"
104+ if (node == null || !node .isWord )
105+ return null ;
106+
107+ // Node was found, remove from tree if possible
108+ node .isWord = false ;
109+ remove (node );
110+ size --;
111+ return value ;
112112 }
113113
114114 private void remove (Node node ) {
115+ // If node is a "word", stop the recursive pruning
116+ if (node .isWord )
117+ return ;
118+
119+ // If node has at least one child, we cannot prune it.
120+ if (node .loKid !=null || node .kid !=null || node .hiKid !=null )
121+ return ;
122+
123+ // Node has no children, prune the node
115124 final Node parent = node .parent ;
125+ if (parent != null ) {
126+ // Remove node from parent
127+ if (parent .loKid ==node ) {
128+ parent .loKid = null ;
129+ } else if (parent .hiKid ==node ) {
130+ parent .hiKid = null ;
131+ } else if (parent .kid ==node ) {
132+ parent .kid = null ;
133+ }
116134
117- // If node does not represent a word and has no children
118- if (!node .isWord && node .loKid ==null && node .kid ==null && node .hiKid ==null ) {
119- if (parent != null ) {
120- // Remove node from parent
121- if (parent .loKid ==node ) {
122- parent .loKid = null ;
123- } else if (parent .hiKid ==node ) {
124- parent .hiKid = null ;
125- } else if (parent .kid ==node ) {
126- parent .kid = null ;
127- }
128- // Go up the tree and prune
135+ // If parent is not a "word" node, go up the tree and prune if possible
136+ if (!node .isWord )
129137 remove (parent );
130- } else {
131- // If node doesn't have a parent, it's root.
132- this .root = null ;
133- }
138+ } else {
139+ // If node doesn't have a parent, it's root.
140+ this .root = null ;
134141 }
135142 }
136143
@@ -168,8 +175,10 @@ private Node search(Node node, C value, int idx) {
168175 return search (node .loKid , value , idx );
169176 if (c > node .character )
170177 return search (node .hiKid , value , idx );
171- if (++idx < value .length ())
172- return search (node .kid , value , idx );
178+ if (idx < (value .length ()-1 )) {
179+ // c == node.char and there is still some characters left in the search string
180+ return search (node .kid , value , ++idx );
181+ }
173182 return node ;
174183 }
175184
@@ -182,24 +191,33 @@ public int size() {
182191 public boolean validate () {
183192 if (this .root == null )
184193 return true ;
185-
186194 return validate (root );
187195 }
188196
189197 private boolean validate (Node node ) {
198+ boolean result = false ;
190199 if (node .loKid != null ) {
191200 if (node .loKid .character >= node .character )
192201 return false ;
193- return validate (node .loKid );
202+ result = validate (node .loKid );
203+ if (!result )
204+ return false ;
194205 }
206+
195207 if (node .kid != null ) {
196- return validate (node .kid );
208+ result = validate (node .kid );
209+ if (!result )
210+ return false ;
197211 }
212+
198213 if (node .hiKid != null ) {
199214 if (node .hiKid .character <= node .character )
200215 return false ;
201- return validate (node .hiKid );
216+ result = validate (node .hiKid );
217+ if (!result )
218+ return false ;
202219 }
220+
203221 return true ;
204222 }
205223
@@ -249,23 +267,20 @@ public static <C extends CharSequence> String getString(TernarySearchTree<C> tre
249267
250268 protected static String getString (Node node , String prefix , String previousString , boolean isTail ) {
251269 final StringBuilder builder = new StringBuilder ();
252- final String string ;
253- final String temp = String .valueOf (node .character );
270+ String string = "" ;
254271 if (previousString != null )
255- string = previousString + temp ;
256- else
257- string = temp ;
272+ string = previousString ;
258273 builder .append (prefix + (isTail ? "└── " : "├── " ) + ((node .isWord == true ) ?
259- ("(" + node .character + ") " + string )
274+ ("(" + node .character + ") " + string + String . valueOf ( node . character ) )
260275 :
261276 node .character ) + "\n "
262277 );
263278 if (node .loKid != null )
264- builder .append (getString (node .loKid , prefix + (isTail ? " " : "│ " ), string . substring ( 0 , string . length ()- 1 ) , false ));
279+ builder .append (getString (node .loKid , prefix + (isTail ? " " : "│ " ), string , false ));
265280 if (node .kid != null )
266- builder .append (getString (node .kid , prefix + (isTail ? " " : "│ " ), string , false ));
281+ builder .append (getString (node .kid , prefix + (isTail ? " " : "│ " ), string + String . valueOf ( node . character ) , false ));
267282 if (node .hiKid != null )
268- builder .append (getString (node .hiKid , prefix + (isTail ? " " : "│ " ), string . substring ( 0 , string . length ()- 1 ) , true ));
283+ builder .append (getString (node .hiKid , prefix + (isTail ? " " : "│ " ), string , true ));
269284 return builder .toString ();
270285 }
271286 }
@@ -372,20 +387,19 @@ protected TreeIterator(TernarySearchTree<C> tree) {
372387
373388 private void getNodesWhichRepresentsWords (TernarySearchTree .Node node , String string , java .util .Map <TernarySearchTree .Node ,String > nodesMap ) {
374389 final StringBuilder builder = new StringBuilder (string );
375- builder .append (node .character );
376390 if (node .isWord )
377391 nodesMap .put (node ,builder .toString ());
378392 if (node .loKid != null ) {
379393 Node child = node .loKid ;
380- getNodesWhichRepresentsWords (child , builder .subSequence ( 0 , builder . length ()- 1 ). toString (), nodesMap );
394+ getNodesWhichRepresentsWords (child , builder .toString (), nodesMap );
381395 }
382396 if (node .kid != null ) {
383397 Node child = node .kid ;
384- getNodesWhichRepresentsWords (child , builder .toString (), nodesMap );
398+ getNodesWhichRepresentsWords (child , builder .append ( node . character ). toString (), nodesMap );
385399 }
386400 if (node .hiKid != null ) {
387401 Node child = node .hiKid ;
388- getNodesWhichRepresentsWords (child , builder .subSequence ( 0 , builder . length ()- 1 ). toString (), nodesMap );
402+ getNodesWhichRepresentsWords (child , builder .toString (), nodesMap );
389403 }
390404 }
391405
0 commit comments