使用dfs的递归树加密方法

时间:2013-12-24 07:03:09

标签: java tree depth-first-search

这个问题不适用于作业,虽然这是一个典型的“类似作业”问题,我试图以不同的方式解决。

我想编写一个方法,该方法将使用深度优先搜索算法以递归方式遍历二叉树,以查找字符的匹配项。一旦找到匹配的字符,我希望它返回一个字符串,该字符串使用0和1来映射树中字符的位置。例如,“001”表示通过转到根节点的左节点,该节点的左节点,然后到该节点的右节点来找到该字符。

这是我到目前为止的代码:

private static String encryptSearch(char c, BinaryNode curNode, String result)
{
    char data = (char) curNode.getData();

    if (data != c)
    {
        if (curNode.hasLeftChild())
        {
            result = result + "0";
            encryptSearch(c, curNode.getLeftChild(), result);
        }
        if (curNode.hasRightChild())
        {
            result = result + "1";
            encryptSearch(c, curNode.getRightChild(), result);  
        }

        result = result.substring(0, result.length()-1);
    }   

    return result;  
} 

该方法最初发送要搜索的字符,根节点,并为结果发送null。除0s外,此方法不返回任何内容。我认为我的代码存在多个问题,但最大的问题是当搜索到达叶子节点时,它会返回。我仍然无法想到解决这个问题的方法,同时仍然返回一个字符串。我可以轻松地编写一个void方法,它将结果字符串作为外部变量,但我不想为了练习而这样做。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

使用可变StringBuilder而不是String。还有一种方法可以知道你在搜索正确的一个之前得到了左边的结果(如果有的话)。所以我建议进行更改。

private static boolean encryptSearch(char c, BinaryNode curNode, StringBuilder result) {
    char data = curNode.getData();
    if (data != c) {
        boolean found = false;
        if (curNode.hasLeftChild()) {
            found = encryptSearch(c, curNode.getLeftChild(), result);
            if (found) {
                result.insert(0, "0");
                return true;
            }
        }
        if (curNode.hasRightChild()) {
            found = encryptSearch(c, curNode.getRightChild(), result);
            if (found) {
                result.insert(0, "1");
                return true;
            }
        }
        return false; //no result
    }
    return true;
}