基本上我想编写一个函数,给定一个决策树,打印树中所有可能的路径,并为每个可能的路径,打印一个布尔值列表(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;
}
}
我的问题是这只会打印第一条路径。
我该如何解决这个问题?
答案 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;
}
}