基于二叉树的思路实现的“十叉树”
来源:互联网 发布: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(); } }
- 基于二叉树的思路实现的“十叉树”
- 重建二叉树的思路
- 基于Java实现的基本二叉树
- 基于Java的二叉树实现
- 基于jquery的tabsUI实现思路
- 基于VpnService实现网络防火墙的思路
- 二叉树的常见问题及其解决思路
- 递归重建二叉树的思路
- 基于二叉搜索树的map的c++实现
- 二叉树后序遍历的两种非递归实现思路
- 一个基于注解的orm简单实现(二):实现思路
- 二叉树基于遍历的进一步操作c++实现
- 基于c语言实现的二叉查找树
- 基于栈来实现二叉树的先根遍历
- 基于栈和队列实现二叉树的遍历
- 数据结构之基于Java的二叉树实现
- 基于栈的非递归方法实现二叉树
- 二叉树的遍历 递归非递归 思路和 java实现
- 【ZooKeeper Notes 12】ZooKeeper 会话超时
- CNNIC:我国网民规模达5.64亿 互联网普及率42.1%
- 黑马程序员 UDP和TCP
- Axure的使用
- Linux课堂--如何查看各种工具版本问题
- 基于二叉树的思路实现的“十叉树”
- C++调用C#的DLL程序方法
- hdu 2870 最大子矩阵 单调队列优化+dp
- 向PC组兄弟们致敬
- Linux ls只是列出文件夹
- Flex+Java 获取本机和客户端的IP地址
- Window下android 模拟器SD卡的使用方法
- TestLink Prague 1.9.5 与 JIRA 5集成
- RCA