【问题标题】:Returning multiple nodes when searching a tree/trie?搜索树/特里时返回多个节点?
【发布时间】:2012-03-17 11:23:49
【问题描述】:

我构建了一个后缀树,一棵包含字符串所有后缀的树,其中每个节点只包含一个字符,每个路径的末尾都有一个 SuffixNode,其中包含字符串中后缀的位置。

假设我的 trie 包含单词“Cat”、“Car”和“Can”,我想搜索“Ca”,结果应该返回 3 个后缀节点,因为搜索字符串在 3 个不同的地方找到。我设法在树中搜索“Ca”,但是一旦到达该点,我不知道如何继续遍历“a”节点的子节点以找到所有后缀节点。

我正在考虑使用某种集合来添加后缀节点,然后返回集合。这种方法有意义吗,还是有更好的解决方案?

我已经解决了下面的搜索问题。它没有返回任何节点的原因与树的创建和节点之间的差异有关:

public void SearchTrie(Node parent, String s, List<SuffixNode> suffixes)
    {
        Node n = FindNode(parent, s);
        FindSuffixes(n, suffixes);
    }

    private void FindSuffixes(Node parent,List<SuffixNode> suffixes)
    {            
        if (parent is SuffixNode)
        {
            suffixes.Add((SuffixNode)parent);
        }
        else
        {
            foreach (KeyValuePair<char, Node> child in parent.children)
            {
                FindSuffixes(child.Value, suffixes);
            }
        }
    }

    private Node FindNode(Node parent, String s)
    {
        if ((s.Length == 1) && parent.children.ContainsKey(s[0]))
        {
            Node n = parent.children[s[0]];
            return n;
        }

        while (s[0].ToString() != "")
        {
            if (parent.children.ContainsKey(s[0]))
            {
                if ((s.Length > 1))
                {
                    return FindNode(parent.children[s[0]], s.Substring(1));
                }

            }
            else
            {
                break;
            }

        }

        return null;
    }

节点:

class Node
{
    public char label;
    public Node parent;
    public Dictionary<char,Node> children;

    public Node(Node NewParent, char NewLabel)
    {
        this.parent = NewParent;
        this.label = NewLabel;
        children=new Dictionary<char,Node>();
    }
}

【问题讨论】:

  • 能否请您发布一些代码/示例?这可能有助于理解这个问题......因为IMO你应该简单地遍历子树(在“CA”下面)......
  • 这就是我想要做的,但我发现它有点困难。我把我之前的搜索功能贴一下,还有哪些代码有用?
  • 你也可以发布 Node 类吗?
  • 我用我的新搜索方法和节点类更新了我的问题

标签: c# tree suffix-tree


【解决方案1】:

我正在考虑使用某种集合来添加后缀节点,然后返回集合。

那将是第一选择。

...,还是有更好的解决方案?

还有其他解决方案,比如

  • 填写调用者提供的列表
  • 使用带有yield return 的迭代器块

但如果没有任何特殊要求,请填写List&lt;string&gt; 并将其返回为IEnumerable&lt;string&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多