Trie树

import scala.collection.mutable.{ArrayBuffer, Map}


class TrieTree
{
    private var root: TrieNode = new TrieNode()


    def insert(word: String)
    {
        var (text, node) = (word.trim, root)

        text.foreach( c =>
            node = node.children.getOrElseUpdate(c, new TrieNode())
        )

        node.terminable = true
        node.count += 1
    }

    def find(word: String): Boolean =
    {
        var node = root

        word.foreach ( c => {
            if (!node.children.contains(c)) return false
            node = node.children(c)
        })

        node.terminable
    }

    def delete(word: String)
    {
        if (!find(word)) return
        deleteText(word, root)
    }

    private def deleteText(word: String, node: TrieNode): Boolean =
    {
        if (word.length == 0) {
            node.terminable = false
            return node.children.isEmpty
        }

        if (deleteText(word.substring(1), node.children(word.charAt(0).toChar))) {
            node.children -= word.charAt(0).toChar
            if (node.children.isEmpty && node.terminable == false) true
        }

        false
    }

    def traverse(): Unit = traverseTrie(root, new StringBuffer())

    private def traverseTrie(node: TrieNode, word: StringBuffer)
    {
        if (node.terminable) {
            println(word + "------" + node.count)
            if (node.children.isEmpty) return
        }

        val children = node.children.keySet

        children foreach { c =>
            traverseTrie(node.children(c), word.append(c))
            word.deleteCharAt(word.length() - 1)
        }
    }


    class TrieNode
    {
        var terminable = false

        var count = 0

        var children: Map[Char, TrieNode] = Map[Char, TrieNode]()
    }
}


object TrieTree
{
    def main(args: Array[String])
    {
        val trie = new TrieTree()
trie.insert("abcd") trie.insert("cd") trie.insert("abdr") trie.traverse() trie.delete("cd") println("\n" + trie.find("cd")) } }

  

转载于:https://www.cnblogs.com/rilley/p/3713289.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值