单词查找树

一、基于单词查找树的符号表:

public class TrieST<Value>
{
	private Node root;
	private static int R = 256;
	private static class Node
	{
		private	Object val;
		private Node[] next = new Node[R];
	}
	public Value get(String key)
	{
		Node x = get(root, key, 0);
		if (x == null) return null;
		return (Value)x.val;
	}
	private Node get(Node x, String key, int d)
	{
		if (x == null) return null;
		if (d == key.length()) return x;
		char c = key.charAt(d);
		return get(x.next[c], key, d+1);
	}
	public void put(String key, Value val)
	{
		root = put(root, key, val, 0);
	}
	private Node put(Node x, String key, Value val, int d)
	{
		if (x == null) x = new Node();
		if (d == key.length()) 
		{
			x.val = val;
			return x;
		}
		char c = key.charAt(d);
		x.next[c] = put(x.next[c], key, val, d+1);
		return x;
	}
	public Iterable<String> keys()                              //查找所有键
	{
		return keysWithPrefix("");
	}
	public Iterable<String> keysWithPrefix(String pre)
	{
		Queue<String> q = new Queue<String>();
		collect(get(root, pre, 0), pre, q);
		return q;
	}
	public void collect(Node x, String pre, Queue<String> q)
	{
		if (x == null) return;
		if (x.val != null) q.enqueue(pre);
		for (char c = 0; c < R; c++)
			collect(x.next[c], pre + c, q);
	}
	public Iterable<String> keysThatMatch(String pat) //通配符匹配
	{
		Queue<String> q = new Queue<String>();
		collect2(root, "", pat, q);
		return q;
	}
	private void collect2(Node x, String pre, String pat, Queue<String> q)
	{
		int d = pre.length();
		if (x == null) return;
		if (d == pat.length() && x.val != null) q.enqueue(pre);
		if (d == pat.length()) return;
		char next = pat.charAt(d);
		for (char c = 0; c < R; c++)
			if (next == '.' || next == c)
				collect2(x.next[c], pre + c, pat, q);
		
	}
	public String longestPrefixOf(String s)            //最长前缀
	{
		int length = search(root, s, 0, 0);
		return s.substring(0, length);
	}
	private int search(Node x, String s, int d, int length)
	{
		if (x == null) return length;
		
		if (x.val != null) length = d;
		if (d == s.length()) return length;
		char c = s.charAt(d);
		return search(x.next[c], s, d+1, length);
	}
	public void delete(String key)  //删除操作
	{
		root = delete(root, key, 0);
	}
	private Node delete(Node x, String key, int d)
	{
		if (x == null) return null;
		if (d == key.length())
			x.val = null;
		else 
		{
			char next = key.charAt(d);
			x.next[next] = delete(x.next[next], key, d+1);
		}
		if (x.val != null)
			return x;
		for (char c = 0; c < R; c++)
			if (x.next[c] != null) return x;
		return null;
	}
}
二、三向单词查找树:

public class TST<Value>
{
	private Node root;
	private class Node
	{
		char c;
		Node left, mid, right;
		Value val;
	}
	public Value get(String key)
	{
		Node x = get(root, key, 0);
		return x.val;
	}
	private Node get(Node x, String key, int d)
	{
		if (x == null) return null;
		char c = key.charAt(d);
		if (c < x.c) return get(x.left, key, d);
		else if (c > x.c) return get(x.right, key, d);
		else if (d < key.length() - 1) return get(x.mid, key, d+1);
		else 
			return x;
	}
	public void put(String key, Value val)
	{
		root = put(root, key, val, 0);
	}
	private Node put(Node x, String key, Value val, int d)
	{
		char c = key.charAt(d);
		if (x == null)
		{
			x = new Node();
			x.c = c;
		}
		if (c < x.c) x.left = put(x.left, key, val, d);
		else if (c > x.c) x.right = put(x.right, key, val, d);
		else if (d < key.length() - 1) x.mid = put(x.mid, key, val, d+1);
		else
			x.val = val;
		return x;
	}
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值