前缀树的和

 /*新建前缀树*/
1.定义数据结构:根节点的26个子节点,可选,用index表示是哪个单词字母
2.新建insert;如果根节点为空,直接返回;如果要插入的字符串为空,就将当前树节点的值设置成给定的value(当前字符串为空有两种情况:1.给定的字符串key=null;value=v;2.key="String",Value=num,在构建树,该key字符串构建完毕,则让当前的节点值等于给定的value)

3.前缀累加求和

当前缀搜索完毕的时候,记录当前节点的值,然后累加当前节点的各个子节点的值。

class MapSum {

    private class Node{
        //1.表示可选择的26个子节点
        Node[] child=new Node[26];
        //2,表示要插入的设置的value值
        int value;
    }
    //新建一个node根节点对象
    private Node root=new Node();
    
    
    /** Initialize your data structure here. */
    public MapSum() {
        
    }
    //开始建立前缀树
    public void insert(String key, int val) {
       insert(key,root,val); 
    }
    private void insert(String key,Node node,int val){
        if(node==null) return;
        if(key.length()==0){
            node.value=val;
            return;
        }  
        int index=indexOfChar(key.charAt(0));
        if(node.child[index]==null){
            node.child[index]=new Node();
        }
        insert (key.substring(1),node.child[index],val);
    }
    //开始求和,如果在树中存在以给定的前缀的字符串,就把他们的字符串对应的叶子节点的值相加
    public int sum(String prefix) {
        return sum(prefix,root);
    }
    private int sum(String prefix,Node node){
        if(node==null) return 0;
        if(prefix.length()!=0){
            int index=indexOfChar(prefix.charAt(0));
            return sum(prefix.substring(1),node.child[index]);
        }
        //前缀字符串查找完毕
        int sum=node.value;
        for(Node child: node.child){
            sum+=sum(prefix,child);
        }
        return sum;
    }
    
    private int indexOfChar(char c){
        return c-'a';
    }
}

/**
 * Your MapSum object will be instantiated and called as such:
 * MapSum obj = new MapSum();
 * obj.insert(key,val);
 * int param_2 = obj.sum(prefix);
 */

猜你喜欢

转载自blog.csdn.net/qq_31957639/article/details/83617502