Java 二叉树中节点的路径

Java 二叉树中节点的路径,java,recursion,binary-tree,Java,Recursion,Binary Tree,我试图递归地显示二叉树中给定节点的路径,该方法将以以下方式输出所需的路径:“左、右、左”。 以下是我到目前为止的情况: 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 != n

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

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”。
完成这项工作后,我打算根据每个节点遍历的正确选项,将该方法从左到右打印出来。有什么想法吗

我想你是在试图从根上找到路径。我还假设树将只有一条路径指向目标。我的意思是相同的元素不能在树的不同位置

这个代码会起作用

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);
    }
}

但这将是一个非常低效且内存成本低的简单解决方案。请阅读有关树遍历的更多信息,以获得一个好的解决方案。

当您在第一个if子句中找到要查找的目标时,您正在打印结果。或者,您应该尝试树的左分支和右分支,就像您在最后一个子句中所做的那样(几乎,您正在做left twive)

我不确定第二个子句应该做什么,但是删除它并在递归调用中将
p.data
添加到
res
应该确保“current”步骤保存在
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);
}

这样,您使用的是递归算法常见的传统基本情况+递归情况。

您的代码对我来说有点不清楚。“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

而且,我忘了打印路径。它现在在那里。

你得到了什么结果?这叫什么?你被困在哪里了。所以我想这是一个二进制搜索,你在其中打印出你检查的字符?@EdC我得到了一个StringIndexOutOfBounds异常,@the Cat:我只想返回从根节点到目标字符的路径。@SimonHillary,我猜你是用一个空字符串开始调用它的,即“”。正因为如此,字符(0)将超过字符串的结尾(因为它当前的长度为0)。非常感谢,这在开始时需要稍微修改,首先检查p==null,如果是,则返回。避免空指针异常@西蒙希拉里:这完全取决于你如何调用你的方法,你没有具体说明:)另外,不要忘记接受你认为最能回答你问题的答案;)对不起我的错!你知道如何修改它,根据遍历到左节点还是右节点来打印“左”或“右”以到达目标吗?@SimonHillary你可以将其添加到向左或向右的递归调用中;使用
res+'''+p.data
。很抱歉,“S”应该是目标字符,我将其用作测试用例,但仍然不知道
target
如何适合这里。但无论如何,这种遍历(travesty?;)将使用所有这些字符串连接来进行可怕的性能扩展。记住这一点。嗯,这是我解决这个问题的第五个“解决方案”,我想我把事情搞砸了。二叉树只有大约50个节点,所以性能不是主要问题!在这种情况下,用一些开瓶器式的直接思维给你的同事留下深刻印象:编写一个置换器,迭代所有可能的0..5个字符的置换。将目标字符附加到每个字符串。然后,对于每个字符串,尝试按字符顺序遍历树。返回实际工作的字符串。你将成为办公室里的英雄;)如果采用Akaidot的“res+>+data”方法,则更容易,只需检查一个方向即可。