基于二叉树的思路实现的“十叉树”

来源:互联网 发布:centos ftp服务开启 编辑:程序博客网 时间:2024/06/08 07:45

该数据结构用于以替代一些简单的本地缓存系统,并提供快速检索的功能。


业务场景:

用户帐号223,拥有下级帐号223001、223002、2230055、22312345...

用户帐号224,拥有下级帐号224002、2248888...

用户...


223和224,我们暂且叫他为大帐号,后面的都叫小帐号。


当这些小帐号发消息给系统时,需要识别出对应的大帐号,且小帐号的长度不等,不可以检索库表。

假设大帐号已经驻留在内存。


java代码:

/** * 基于二叉树的思路实现的“十叉树”,用于存储一些临时性的数据,并提供一些查询接口 * @project xframework * @date 2013-1-11 * @version 1.0 * @author Jason5186@qq.com *  * @review_history * [2013-1-11] create by Jason */public class BinaryTree {// 树的根结点private TreeNode root = null;/** *  */public BinaryTree() {// TODO Auto-generated constructor stubroot = new TreeNode(0);}private class TreeNode {private int key; private Object value;private TreeNode[] nodes = new TreeNode[10];public TreeNode(int key) {// TODO Auto-generated constructor stubthis(key, null);}public TreeNode(int key, Object value) {this.key = key;this.value = value;}public TreeNode setChildTreeNode(int key, Object value){synchronized(this){TreeNode treeNode = nodes[key];if (treeNode == null) {nodes[key] = new TreeNode(key);}getChildTreeNode(key).setValue(value);}return getChildTreeNode(key);}public TreeNode setChildTreeNode(int key){synchronized(this){TreeNode treeNode = nodes[key];if (treeNode == null) {nodes[key] = new TreeNode(key);}}return getChildTreeNode(key);}public TreeNode getChildTreeNode(int key){return nodes[key];}public int getKey() {return key;}public Object getValue(){return value;}public void removeValue(){this.value = null;}public void setValue(Object value){this.value = value;}public String toString(){return "(" + key + " , " + value + " )";}}/** * 空返回 true ,否则返回 false .  */public boolean isEmpty(){if (root == null) {return true;} else {return false;}}public void TreeEmpty() throws Exception {if (isEmpty()) {throw new Exception("树为空");}}/** * 查找指定s_key对应的节点 * @param s_key * @return TreeNode * @throws Exception */public TreeNode search(String s_key) throws Exception {if (getRoot() == null) {throw new Exception("root node is null");}TreeNode treeNode = getRoot();char[] key_array = s_key.toCharArray();// 根据给定的s_key,遍历tree node的绝对路径,且以最短匹配的规则检索;// 命中后返回对应的tree node,否则返回Null。for (char skey : key_array) {int key = skey & 0xf;TreeNode t_treeNode = treeNode.getChildTreeNode(key);if (t_treeNode == null) {// 该节点尚未创建:return null;}else if (t_treeNode.getValue() != null) {// 命中:return t_treeNode;}else{// 否则,将遍历下一个节点:treeNode = t_treeNode;}}// 循环体之外,将视为未命中:return null;}/** * 将指定的s_key放入节点,并设置对应的value * @param s_key * @param value * @throws Exception  */public void insert(String s_key, Object value) throws Exception{TreeNode treeNode = getRoot();char[] key_array = s_key.toCharArray();int s_key_length = key_array.length;int s_key_count = 1;/* * 根据给定的key_array的长度,查找节点、布置节点并得到最后一个节点的tree node,然后赋值value。 */for (char skey : key_array) {int key = skey & 0xf;// 取某节点下,N个子节点中的一个分支:TreeNode t_treeNode = treeNode.getChildTreeNode(key);if (t_treeNode == null) {// 创建一个新的子节点:t_treeNode = treeNode.setChildTreeNode(key);}else{if (t_treeNode.getValue() != null && s_key_count != s_key_length) {treeNode = null;break;}}// 该节点已经存在,节点交换:treeNode = t_treeNode;s_key_count++;}if (treeNode != null) {// 为最后一个节点赋值:treeNode.setValue(value);}}/** * 删除指定key的节点 * @param s_key * @throws Exception */public void delete(String s_key) throws Exception{TreeNode node = search(s_key);if (node == null) {throw new Exception("Tree node not found, Tree node key is:["+s_key+"]");}node.removeValue();node = null;}public TreeNode getRoot() {return root;}}

Test:

public static void main(String[] args)     {    try {    BinaryTree bt = new BinaryTree();    String key = "223";    String msg = "hello jason";    bt.insert(key, msg);        TreeNode node = bt.search(key);    if (node != null) {    System.out.println(node.getValue());    }        node = bt.search("223001");    if (node != null) {    System.out.println(node.getValue());    }            System.out.println("Done!");        } catch (Exception e) {    System.out.println(e.getMessage());    e.printStackTrace();    }    }