递归地查找二进制树中节点的路径

时间:2014-11-20 22:17:46

标签: java path binary-tree nodes

我知道正在搜索的节点位于未排序的二叉树中,但我无法弄清楚如何通过递归调用传回我的路径。我的两个函数:一个找到特定节点的路径,另一个返回一个到所有节点的路径串。 0表示采用左路径,1表示右路。

private static String getAllPaths(final BinaryNodeInterface<Character> root)
{
    // TO DO
    String path = "";
    String returnStr = "";
    return getAP(root, path, returnStr);
}

private static String getAP(BinaryNodeInterface<Character> root, String path,
        String returnStr) 
{
    returnStr += "" + root.getData() + " " + path + "\n";
    if(root.hasLeftChild())
        getAP( root.getLeftChild(), path.concat("0"), returnStr);
    if(root.hasRightChild())
        getAP( root.getRightChild(), path.concat("1"), returnStr);

    return returnStr;
}

private static String getPathTo(final BinaryNodeInterface<Character> root, char c)
{
    // TO DO
    String path = "";
    if( root.getData() == c )
        return path;

    if( root.hasLeftChild() )
    {
        String s = getPathTo(root.getLeftChild(), c);

        if( s != null )
        {
            path += "0";
            path += s;
            return path;
        }
    }

    if( root.hasRightChild() )
    {
        String s = getPathTo(root.getRightChild(), c);

        if( s != null )
        {
            path += "1";
            path += s;
            return path;
        }
    }

    return null;
}

我在递归时非常糟糕,所以非常感谢任何帮助。我把这一切都搞定了。以上代码现在很好。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

字符串在java中是不可变的。将String传递给方法时,会创建一个全新的值。例如:

void modifyString(String x) {
    x += "(modified)";
}

如果您使用以下方法:

String s = "myString!";
modifyString(s);
// what does s equal?

您可能期望s == "myString!(modified)",但这不是真的。

在您的情况下,您将returnStr作为参数传递给getAP的递归调用。但是,它不会像您假设的那样进行修改。要修复它,请将递归方法调用的结果追加到本地returnStr并返回。

// removed returnStr as a parameter
private static String getAP(BinaryNodeInterface<Character> root, String path) 
{
    String returnStr = "" + root.getData() + " " + path + "\n";
    if(root.hasLeftChild())
        returnStr += getAP( root.getLeftChild(), path.concat("0")); 
    if(root.hasRightChild())
        returnStr += getAP( root.getRightChild(), path.concat("1"));

    return returnStr;
}

我瞥了一眼你的getPT方法,我实际上并没有看到任何明显的问题。