Java字典树的实现


Java字典树的实现


//Trie Data structure implementation without any libraries */

import java.util.Scanner;

public class TrieImp {

    public class TrieNode {
        TrieNode[] child;
        boolean end;

        public TrieNode(){
            child = new TrieNode[26];
            end = false;
        }
    }
    private final TrieNode root;
    public TrieImp(){
        root = new TrieNode();
    }

    public void insert(String word){
        TrieNode currentNode = root;
        for(int i=0; i < word.length();i++){
            TrieNode node = currentNode.child[word.charAt(i)-'a'];
            if(node == null){
                node = new TrieNode();
                currentNode.child[word.charAt(i)-'a']=node;
            }
            currentNode = node;
        }
        currentNode.end = true;
    }
    public boolean search(String word){
        TrieNode currentNode = root;
        for(int i=0;i<word.length();i++){
            char ch = word.charAt(i);
            TrieNode node = currentNode.child[ch-'a'];
            if(node == null){
                return false;
            }
            currentNode = node;
        }
        return currentNode.end;
    }

    public boolean delete(String word){
        TrieNode currentNode = root;
        for(int i=0;i<word.length();i++){
            char ch = word.charAt(i);
            TrieNode node = currentNode.child[ch-'a'];
            if(node == null){
                return false;
            }
            currentNode = node;
        }
        if(currentNode.end == true){
            currentNode.end = false;
            return true;
        }
        return false;
    }

    public static void sop(String print){
        System.out.println(print);
    }

    //Regex to check if word contains only a-z character
    public static boolean isValid(String word){
        return word.matches("^[a-z]+$");
    }

    public static void main(String[] args) {
        TrieImp obj = new TrieImp();
        String word;
        @SuppressWarnings("resource")
        Scanner scan = new Scanner(System.in);
        sop("string should contain only a-z character for all operation");
        while(true){
            sop("1. Insert\n2. Search\n3. Delete\n4. Quit");
            try{
                int t = scan.nextInt();
                switch (t) {
                    case 1:
                        word = scan.next();
                        if(isValid(word))
                            obj.insert(word);
                        else
                            sop("Invalid string: allowed only a-z");
                        break;
                    case 2:
                        word = scan.next();
                        boolean resS=false;
                        if(isValid(word))
                            resS = obj.search(word);
                        else
                            sop("Invalid string: allowed only a-z");
                        if(resS)
                            sop("word found");
                        else
                            sop("word not found");
                        break;
                    case 3:
                        word = scan.next();
                        boolean resD=false;
                        if(isValid(word))
                            resD = obj.delete(word);
                        else
                            sop("Invalid string: allowed only a-z");
                        if(resD){
                            sop("word got deleted successfully");
                        }else{
                            sop("word not found");
                        }
                        break;
                    case 4:
                        sop("Quit successfully");
                        System.exit(1);
                        break;
                    default:
                        sop("Input int from 1-4");
                        break;
                }
            }catch(Exception e){
                String badInput = scan.next();
                sop("This is bad input: " + badInput);
            }
        }
    }

}