在Java中运行树

在Java中运行树,java,recursion,tree,Java,Recursion,Tree,基本上,我想写一个函数,给定一个决策树,它会打印树中所有可能的路径,对于每个可能的路径,也会打印一个布尔值列表(true或false),指示它在树中是向左(true)还是向右(false) 以下是我的树类型: public class Tree { private TreeNode root; private static class TreeNode { private Pair<String, Float> data; private TreeNode le

基本上,我想写一个函数,给定一个决策树,它会打印树中所有可能的路径,对于每个可能的路径,也会打印一个布尔值列表(true或false),指示它在树中是向左(true)还是向右(false)

以下是我的树类型:

public class Tree {

private TreeNode root;


private static class TreeNode {
    private Pair<String, Float> data;
    private TreeNode leftNode;
    private TreeNode rightNode;

    private TreeNode( Pair<String, Float> data, TreeNode left, TreeNode right) {
        this.data = data;
        this.leftNode = left;
        this. rightNode = right;
        }
    }
}
公共类树{
独活根;
私有静态类树节点{
私有对数据;
私有树节点;
私有树节点;
专用TreeNode(成对数据,TreeNode左,TreeNode右){
这个数据=数据;
this.leftNode=left;
this.rightNode=right;
}
}
}
到目前为止,我已经做到了以下几点:

private void getTreePaths(TreeNode r, List<Pair<String, Float>> list,
        List<String> flags) {

    if (r == null)
        return;

    // adds the node to the list
    list.add(r.data);

    // goes left
    if (r.leftNode != null) {

        //went left
        flags.add("true");
        getTreePaths(r.leftNode, new ArrayList<Pair<String, Float>>(list), flags);
    }

    //instead goes right
    else if (r.rightNode != null) {
        //went right
        flags.add("false");
        getTreePaths(r.rightNode, new ArrayList<Pair<String, Float>>(list), flags);
    }

    else if (r.leftNode == null && r.rightNode == null) {
        System.out.println(list.toString());
        System.out.println(flags.toString());
        return;
    }
}
private void gettreepath(树节点r,列表,
列表标志){
if(r==null)
返回;
//将节点添加到列表中
列表。添加(r.数据);
//向左走
if(r.leftNode!=null){
//向左走
标记。添加(“真”);
GetTreePath(r.leftNode、新ArrayList(列表)、标志);
}
//相反,这是正确的
else if(r.rightNode!=null){
//走对了
标记。添加(“假”);
GetTreePath(r.rightNode、新ArrayList(列表)、标志);
}
else if(r.leftNode==null&&r.rightNode==null){
System.out.println(list.toString());
System.out.println(flags.toString());
返回;
}
}
我的问题是,这只打印第一条路径


如何解决此问题?

什么是getTreeRules?那应该是GetTreepath吗?您需要为每个节点回调函数

编辑评论中的最后一个问题:

您的标志列表正在累积,因为您正在向左添加,然后向右移动时保留该列表。您可以尝试以下方法:

private void getTreePaths(TreeNode r, List<Pair<String, Float>> list,
        List<String> flags, boolean lastmove) {

    flags.add(lastmove);

    if (r == null)
        return;

    // adds the node to the list
    list.add(r.data);

    // goes left
    if (r.leftNode != null) {

        //went left
        getTreePaths(r.leftNode, new ArrayList<Pair<String, Float>>(list), flags, true);
    }

    //go right
    if (r.rightNode != null) {
        //went right
        getTreePaths(r.rightNode, new ArrayList<Pair<String, Float>>(list), flags, false);
    }

    if (r.leftNode == null && r.rightNode == null) {
        System.out.println(list.toString());
        flags.remove(0); //remove first element because you passed in false value with root
        System.out.println(flags.toString());
        return;
    }
}
private void gettreepath(树节点r,列表,
列表标志,布尔值(移动){
flags.add(lastmove);
if(r==null)
返回;
//将节点添加到列表中
列表。添加(r.数据);
//向左走
if(r.leftNode!=null){
//向左走
GetTreePath(r.leftNode,新ArrayList(list),标志,true);
}
//向右转
if(r.rightNode!=null){
//走对了
GetTreePath(r.rightNode、新ArrayList(list)、标志、false);
}
if(r.leftNode==null&&r.rightNode==null){
System.out.println(list.toString());
flags.remove(0);//删除第一个元素,因为您用root传入了false值
System.out.println(flags.toString());
返回;
}
}

如何调用
gettreepath()
?您是否试图递归地解决问题?如果是这样,代码中就没有递归。@BassemDy是的,我的想法是递归地执行它@queryMaster需要一个递归函数,该函数将在到达每个叶节点时返回路径。布尔值有点混乱。。。我猜字符串“左”和“右”应该是better@Suspended如果您注意到,这正是我正在使用的:)但是我在正确获取这些值时遇到困难…您可能还需要将“else if go right”更改为另一个if而不使用else,否则您将错过这些路径。但是,标记列表的打印不太正确,它正在积累所有的价值。如何更改?这不是因为第一次调用函数时,
TreeNode
是根节点。如果需要,您可以先调用该方法并输入true或false,然后在打印flags.toString时,先删除第一个元素。谢谢!回答得好!