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