字典树

  字典树是一种很常用的数据结果,用于判断一个单词在不在字典里面,时间复杂度是单词的长度。有次微软实习的笔试题是给10w个网段,问一个ip在不在这些网段里面,也是用字典树可以解决。

  字典树的节点定义如下:

    public class Node{
        private boolean end;
        private Node[] children;
        public Node(){
            end = false;
            children = new Node[26];
        }
    }

  end表示单词是否完结,children是26个子孩子,从a到z

  单词插入:

     从根节点往叶子节点走,根据当前的字符得到子孩子的下标,若子孩子为null,则新建一个Node,然后向子孩子走,直到单词遍历完。

  单词查询:

     从根节点往叶子节点走,根据当前的字符得到子孩子的下标,若子孩子为null,表示单词不在字典里面,否则向子孩子走,遍历完单词之后,返回所在节点的end标记。

  代码如下:

    public class Tree{
        private Node root;
        public Tree(){
            root = new Node();
        }
        public void addWord(String word){
            word = word.toLowerCase().trim();
            Node p = root;
            for(int i=0;i<word.length();i++){
                int index = word.charAt(i) - 'a';
                if(p.children[index]==null){
                    p.children[index] = new Node();
                }
                p = p.children[index];
            }
            p.end = true;
        }
        
        public boolean isExist(String word){
            word = word.toLowerCase().trim();
            Node p = root;
            for(int i=0;i<word.length();i++){
                int index = word.charAt(i) - 'a';
                if(p.children[index]==null){
                    return false;
                }
                p = p.children[index];
            }    
            return p.end;
        }
    }
posted @ 2017-04-21 17:33  ezio_wg  阅读(124)  评论(0编辑  收藏  举报