C#字典树(字母树)的模板

来源:互联网 发布:开黑用什么软件 编辑:程序博客网 时间:2024/05/21 09:24

保存一下JimLiu大神的
既然JimLiu大神的这个.net博客不维护了。
我就搬过来了。哈哈哈~~~~~希望JimLiu大神不要见怪。。。



/**//// <summary>/// 泛型字母树,忽略大小写/// </summary>/// <typeparam name="T">泛型类型</typeparam>public class TrieTree<T> {    private class TrieNode {        fields#region fields        private TrieNode[] m_Childs;        private T m_Value;        private bool m_HasValue;        #endregion        constructors#region constructors        /**//// <summary>        /// 创建字母树结点,元素被赋值为该类型的默认值        /// </summary>        public TrieNode() : this(default(T)) { m_HasValue = false; }        /**//// <summary>        /// 创建字母树结点        /// </summary>        /// <param name="elem">该结点的元素</param>        public TrieNode(T elem) {            m_Childs = new TrieNode[26];            m_Value = elem;            m_HasValue = true;        }        #endregion        properties#region properties        /**//// <summary>        /// 子节点        /// </summary>        public TrieNode[] Childs { get { return m_Childs; } }        /**//// <summary>        /// 节点的值        /// </summary>        public T Value {            get { return m_Value; }            set { m_Value = value; }        }        /**//// <summary>        /// 结点是否有值        /// </summary>        public bool HasValue {            get { return m_HasValue; }            set { m_HasValue = value; }        }        #endregion    }    fields#region fields    private TrieNode root = new TrieNode();    #endregion    private methods#region private methods    TrieNode findNode(string key) {        TrieNode node = root;        foreach (char c in key) {            int i = (c >= 'A' && c <= 'Z') ? (int)(c - 'A' + 'a') : (int)(c - 'a');            if (node.Childs[i] == null) node.Childs[i] = new TrieNode();            node = node.Childs[i];        }        return node;    }    #endregion    public methods#region public methods    /**//// <summary>    /// 插入    /// </summary>    /// <param name="key">键</param>    /// <param name="value">值</param>    public void Insert(string key, T value) {        TrieNode node = findNode(key);        if (node.HasValue) return;        node.Value = value;        node.HasValue = true;    }    /**//// <summary>    /// 查找,若不存在,则插入    /// </summary>    /// <param name="key">键</param>    /// <param name="value">结点不存在时所赋的值</param>    /// <returns>查找结果</returns>    public T FindOrInsert(string key, T value) {        TrieNode node = findNode(key);        if (!node.HasValue) {            node.Value = value;            node.HasValue = true;        }        return node.Value;    }    /**//// <summary>    /// 查找,若不存在,则返回默认值    /// </summary>    /// <param name="key">键</param>    /// <param name="defaultValue">默认值</param>    /// <returns>查找结果</returns>    public T Find(string key, T defaultValue) {        TrieNode node = findNode(key);        if (node.HasValue) return node.Value;        return defaultValue;    }    #endregion    indexer#region indexer    /**//// <summary>    /// 获取或设置某个键对应的值    /// </summary>    /// <param name="key">键</param>    /// <returns>查找结果,若不存在,则返回该泛型类型的默认值</returns>    public T this[string key] {        get { return Find(key, default(T)); }        set {            TrieNode node = findNode(key);            node.HasValue = true;            node.Value = value;        }    }    #endregion}