运行 通过 Java 中的一棵树

Running through a Tree in Java

基本上我想写一个函数,给定一个决策树,打印树中所有可能的路径,并且对于每个可能的路径,还打印一个布尔值列表(真或假),表明它是否在树中向左 (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;
        }
    }
}

这是我到目前为止所做的:

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

我的问题是这只打印了第一条路径。

我该如何解决这个问题?

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

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

您的标志列表正在累积,因为您向左添加,然后在向右添加时保留该列表。你可以尝试这样的事情:

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