/*新建前缀树*/
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);
*/