public class TrieTree {

    public Node root;

    public TrieTree(){
        root = new Node(' ');
    }

    /** 插入字符串 */
    public void insert(String str){

        if(str == null){
            return;
        }

        Node node = this.root;

        /** 每次进来都要加一 */
        node.pass ++;

        char [] chs = str.toCharArray();
        int path;
        for (int i = 0; i < chs.length; i++) {
            path = chs[i] - 'a';

            /** 如果没有到达path的节点 那么就新建 */
            if(node.nexts[path] == null){
                node.nexts[path] = new Node(chs[i]);
            }

            node = node.nexts[path];

            node.pass ++;

        }

        /** 最后一个节点收尾 要加一 */
        node.end ++;

    }

    /** 查找字符串的出现次数 */
    public int search(String str){
        if(str == null){
            return 0;
        }

        int path;
        char[] chs = str.toCharArray();

        Node node = this.root;

        for (int i = 0; i < chs.length; i++) {

            path = chs[i] - 'a';
            if(node.nexts[path] == null){
                return 0;
            }

            node = node.nexts[path];
        }

        return node.end;
    }

    /** 删除字符串 */
    public void delete(String str){

        if(str == null){
            return;
        }

        /** 删除之前 需要判断是否加入过 */
        if(search(str) == 0){
            return;
        }

        int path;
        Node node = this.root;

        node.pass --;
        char [] chs = str.toCharArray();
        for (int i = 0; i < chs.length; i++) {
            path = chs[i] - 'a';

            /** 要考虑一件事 有可能这次delete后 会有无效的节点残留 */
            /** 如果 next接单的pass值-1后为0了 那么就舍弃掉next之后的(包括next)所有节点 */
            if(--node.nexts[path].pass == 0){
                node.nexts[path] = null;
                return;
            }

            node = node.nexts[path];
        }

        node.end --;
    }


    public static class Node{

        public Node [] nexts;
        public int pass;
        public int end;
        public char c;

        public Node(char c){
            this.nexts = new Node[26];
            this.pass = 0;
            this.end = 0;
            this.c = c;
        }
    }
}