最长的重复子串后缀树dfs

时间:2013-02-14 20:00:38

标签: java string algorithm tree

我在实现这个方面遇到了一些麻烦。我知道我需要进行深度优先搜索以找到最深的路径,它将给出子串的索引。在实现dfs时遇到一些问题,可能是我的理解不好:

int getDeepestPath(TreeNode node)
{
    int maxDistance = 0;
    TreeNode maxNode;
    if(node == null) return 0;
    System.out.println(node.getSuffix());
    if(node.getSuffix() != -1) return 0;  
    else
    {
        TreeNode nextNode = node.getChild();
        while(true)
        {
            int distance = 0;
            if(nextNode != null)
            {
                distance = (nextNode.getRightLabel() -nextNode.getLeftLabel()) + 1;
                System.out.println(distance + " distance");
                distance = getDeepestPath(nextNode,t2Info) + distance;
                if(distance > maxDistance) maxDistance = distance;
                nextNode = nextNode.getSibling();
            }
            else break;
        }
    }

    System.out.println(maxDistance);
    return maxDistance;
}

最终的目标是存储最深的节点和路径的长度 - 我现在只是试图打印路径的长度。

由于

2 个答案:

答案 0 :(得分:0)

为什么不直接使用堆栈实现DFS并将变量添加到名为node的{​​{1}}。每次将节点推送到堆栈时,请标记visited。伪代码

visited = true

实现查找叶子,进入下一个分支和弹出的逻辑。 这是一个通用的逻辑,如果你有一个二叉树,你可以改变它,让它变得更简单只有两个孩子(左和右)

答案 1 :(得分:0)

你的假设是错误的。

在后缀树中,每个节点都应包含在该节点上终止的字符串的键列表。如果列表为空,则该节点不定义任何字符串。没有必要在树中找到长路径。例如,如果树中有三个字符串,“app”(1),“apple”(2)和(5),以及“apple pie”(3),那么树将如下所示:

"app" 1  
  |  
"le" 2, 5  
  |  
" pie" 3