字典樹--java 定義
阿新 • • 發佈:2019-01-09
閒著寫了一個字典樹的模板,包括:生成字典樹,查詢某個字串(字首)是否出現以及次數,列印某個字首所涉及的字串等功能
package aaa; import java.util.*; public class Main { static Scanner in = new Scanner(System.in); static Node root; static int n; public static void main(String[] args) { n = in.nextInt(); String s; root = new Node(); for(int i = 0; i < n;i++) { s = in.next(); root.insert(root, s); } String str = in.next(); root.printStr(root, str); } } class Node{ static int kind = 0; int num;//出現次數 int id;//在樹中的數字索引 boolean isend;//是否到了單詞的結束 Node[] son;//兒子節點 char val; Node(){ id = 0; num = 0; son = new Node[26]; isend = false; } int insert(Node root,String str) { Node t = root; int k; for(int i = 0; i < str.length();i++) { k = str.charAt(i)-'a'; if(t.son[k]==null) { t.son[k]= new Node(); t.son[k].val = str.charAt(i); } t.son[k].num++; t = t.son[k]; } if(t.isend) return t.id; else { t.isend = true; t.id = kind++; return t.id; } } int conut(Node root,String str) { int k; Node t = root; for(int i = 0;i < str.length();i++) { k = str.charAt(i)-'a'; if(t.son[k]==null) return 0; else t = t.son[k]; } return t.num; } void printStr(Node root,String prefix) { int k; Node t = root; for(int i = 0;i < prefix.length();i++) { k = prefix.charAt(i)-'a'; if(t.son[k]==null) return; else t = t.son[k]; } preTraverse(t,prefix); return ; } void preTraverse(Node root,String prefix) { if(root.isend) { System.out.println(prefix); return ; } for (Node child : root.son){ if (child!=null){ preTraverse(child, prefix+child.val); } } } }