在Java中运行一棵树

时间:2015-05-11 00:30:34

标签: java recursion tree

基本上我想编写一个函数,给定一个决策树,打印树中所有可能的路径,并为每个可能的路径,打印一个布尔值列表(true或false),指示它是否向左树中的(true)或right(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;
    }
}

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

什么是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;
    }
}