【问题标题】:Running through a Tree in Java在Java中运行一棵树
【发布时间】:2018-11-15 14:16:25
【问题描述】:

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

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

我该如何解决这个问题?

【问题讨论】:

  • 你是如何调用getTreePaths()的?您是否正在尝试递归解决问题?如果是这样,则您的代码中没有递归。
  • @BassemDy 是的,我的想法是递归地进行!
  • @queryMaster 你需要一个递归函数,它会在到达每个叶节点时返回一条路径。布尔值有点混乱......我猜字符串“左”和“右”会更好
  • @Suspended 如果您注意到,这正是我正在使用的 :) 但是我无法正确获取这些值...

标签: java recursion tree


【解决方案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;
    }
}

【讨论】:

  • 如果没有 else,您可能还需要将“else if go right”更改为另一个,否则您会错过这些路径。
  • 但是标志列表的打印不太正确,它正在累积所有值。我该如何改变呢?
  • 不是因为TreeNode是函数第一次调用时的根节点
  • 如果你愿意,你可以先调用方法并输入true或false,然后当你去打印flags.toString的时候,先删除第一个元素。
  • 谢谢!很好的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2017-10-29
  • 1970-01-01
  • 2017-10-21
相关资源
最近更新 更多