c# 字典树_c++树的遍历

c# 字典树_c++树的遍历c#入门Trie基于SortedDictionary添加查询非递归实现递归实现前缀基于SortedDictionary添加查询非递归实现递归实现前缀publicclassTrie{privateclassNode{publicboolIsWord;publicSortedDictionary<char,Node>Next;publicNode(boolisWord)

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Trie

添加

IsWord表示一个单词的结束
单词字母内容由 平衡二叉树 存储

查询

非递归实现

递归实现

前缀

Ternary Search Trie

待更新
在这里插入图片描述

public class Trie
{ 
   
    private class Node
    { 
   
        public bool IsWord;
        public SortedDictionary<char, Node> Next;

        public Node(bool isWord)
        { 
   
            IsWord = isWord;
            Next = new SortedDictionary<char, Node>();
        }

        public Node():this(false)
        { 
   
            
        }
    }

    private Node root;
    private int size;

    public Trie()
    { 
   
        root = new Node(false);
        size = 0;
    }

    public int Size()
    { 
   
        return size;
    }

    // 向 Trie 中添加一个 单词
    public void Add(string word)
    { 
   
        Node cur = root;
        foreach (var ch in word)
        { 
   
            if (!cur.Next.ContainsKey(ch))
                cur.Next[ch] = new Node(false);
            cur = cur.Next[ch];
        }

        if (cur.IsWord) return;

        cur.IsWord = true;
        ++size;
    }

    // 查询单词是否在 Trie 中 非递归实现
    public bool Contains(string word)
    { 
   
        Node cur = root;
        foreach (var ch in word)
        { 
   
            if (!cur.Next.ContainsKey(ch))
                return false;
            cur = cur.Next[ch];
        }

        return cur.IsWord;
    }
    // 递归实现
	public bool ContainsRecursive(string word)
    { 
   
        return Contains(root, word, 0);
    }

    private bool Contains(Node node, string str, int index)
    { 
   
        if (index > str.Length - 1)
            return node.IsWord;
        if (!node.Next.ContainsKey(str[index]))
            return false;
        return Contains(node.Next[str[index]], str, ++index);
    }

    public bool IsPrefix(string prefix)
    { 
   
        Node cur = root;
        foreach (var ch in prefix)
        { 
   
            if (!cur.Next.ContainsKey(ch))
                return false;
            cur = cur.Next[ch];
        }

        return true;
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197734.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号