现在的位置: 首页 > 综合 > 正文

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

2019年06月19日 ⁄ 综合 ⁄ 共 3455字 ⁄ 字号 评论关闭

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

业务场景:

用户帐号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 stub
		root = 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 stub
			this(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();
    	}
    }

抱歉!评论已关闭.