这个问题不适用于作业,虽然这是一个典型的“类似作业”问题,我试图以不同的方式解决。
我想编写一个方法,该方法将使用深度优先搜索算法以递归方式遍历二叉树,以查找字符的匹配项。一旦找到匹配的字符,我希望它返回一个字符串,该字符串使用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方法,它将结果字符串作为外部变量,但我不想为了练习而这样做。任何帮助表示赞赏!
答案 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;
}