package com.interview.suffixprefix;
/**
* http://www.geeksforgeeks.org/ternary-search-tree/
*/
public class TernaryTree {
private Node root = null;
class Node{
char data;
boolean isLeaf;
Node left, right, eq;
}
public void insert(String data){
Node root = insert(this.root,data,0);
this.root = root;
}
public boolean search(String data){
return search(root,data,0);
}
private boolean search(Node root,String data,int pos){
if(pos == data.length()){
return true;
}
if(root == null){
return false;
}
if(root.data == data.charAt(pos)){
boolean result = search(root.eq,data,pos+1);
if(pos == data.length() -1){
return result && root.isLeaf;
}
return result;
}else if(root.data < data.charAt(pos)){
return search(root.right,data,pos);
}else{
return search(root.left,data,pos);
}
}
private Node insert(Node root,String data,int pos){
if(pos == data.length()){
return root;
}
if(root == null){
root = new Node();
root.data = data.charAt(pos);
root.eq = insert(root.eq,data,pos+1);
if(pos == (data.length()-1)){
root.isLeaf = true;
}
}else{
if(root.data == data.charAt(pos)){
root.eq = insert(root.eq,data,pos+1);
if(pos == (data.length()-1)){
root.isLeaf = true;
}
}
else if(root.data < data.charAt(pos)){
root.right = insert(root.right,data,pos);
}else{
root.left = insert(root.left,data,pos);
}
}
return root;
}
public static void main(String args[]){
TernaryTree tt = new TernaryTree();
tt.insert("cute");
tt.insert("as");
tt.insert("at");
tt.insert("cut");
tt.insert("cup");
tt.insert("time");
tt.insert("tax");
tt.insert("bat");
System.out.println(tt.search("cute"));
System.out.println(tt.search("cut"));
System.out.println(tt.search("tax"));
System.out.println(tt.search("as"));
System.out.println(tt.search("abat"));
}
}