二进制树中节点的路径

时间:2012-11-16 10:09:22

标签: java recursion binary-tree

我试图以递归方式显示二叉树中给定节点的路径,该方法将按以下方式输出所需的路径:“left,right,left”。 以下是我到目前为止的情况:

public static void pathToNode(BTNode p, char target, String res){
    if(p.data == target){
        res = res + p.data;
        System.out.println(res);
        return;
    }else if(res != null){
        if(res.charAt(0) == 'S'){
        res = res + p.data;
        }
    }else{
        pathToNode(p.leftLink, target, res);
        pathToNode(p.leftLink, target, res);
    }

}

此代码旨在打印出如下所示的路径:“ABCD”。 完成此操作后,我打算根据每个节点遍历的正确选项将方法打印出来。有任何想法吗?

3 个答案:

答案 0 :(得分:1)

我的代码对我来说有点不清楚。 'S'应该是根有效载荷吗?此外,您应该尝试使用更多有用的变量名称。

public static String pathToNode(BTNode p, char target) {
    // termination rules
    if (p.data == target) {
       // success
       return p.data;       
    }
    // failure: p is not the target AND is a leaf.
    if (p.leftLink == null && p.rightLink == null) return null;

    // recursion: if p is in the subtree, this will find it.
    return (pathToNode(p.leftLink, target) == null) ? (p.data + pathToNode(p.rightLink), target) : (p.data + pathToNode(p.leftLink, target));

}

编辑:当然,如果目标不在树中,这可能会返回null。       而且,我忘了实际打印路径。它就在那里。

答案 1 :(得分:0)

我认为你正试图从根找到路径。此外,我假设树只有一个目标路径。我的意思是相同的元素不能在树中的不同位置。

此代码可以使用,

public static void pathToNode(BTNode p, char target, String res){
    if(p.data == target){
        res += p.data;
        System.out.println(res);
        return;
    }
    else{
        if(res==null){
           res="";
        }
        res += p.data;
        pathToNode(p.leftLink, target, res);
        pathToNode(p.rightLink, target, res);
    }
}

但这将是非常低效的并且内存成本容易解决。请阅读有关树遍历的更多信息以获得良好的解决方案。

答案 2 :(得分:0)

当您在第一个if子句中找到要查找的目标时,将打印结果。或者,您应该尝试树的左侧和右侧分支,在最后一个条款中您(几乎,您正在做左侧)的操作。

我不确定第二个子句应该做什么,但删除它并在递归调用中将p.data添加到res应该确保“当前”步骤保存在res变量:

if (p.data == target) {
    res = res + p.data;
    System.out.println(res);
} else {
    pathToNode(p.leftLink, target, res + p.data);
    pathToNode(p.rightLink, target, res + p.data);
}

这样,你就可以使用传统的基本案例+递归算法常用的递归案例。