【问题标题】:Creating a list of leaves recursively in a binary tree java在二叉树java中递归创建叶子列表
【发布时间】:2019-10-13 20:11:40
【问题描述】:

我的计算二叉树中叶子数量的递归函数工作正常:

public static int numberOfLeaves(BinaryTree<String> root) {

    if (root == null) return 0;
    else if(root.isLeaf()) return 1;
    int left = numberOfLeaves(root.leftTree);
    int right = numberOfLeaves(root.rightTree);
    return (left + right);
}

但现在我想将所有叶子的数据汇总在一个List 中并返回

看看我绝望的尝试:

public ArrayList<String> getDataLeaves(BinaryTree<String> root) {

    ArrayList<String> list = new ArrayList<>();

    if (root == null) return list;
    else if (root.isLeaf()) list.add(root.data);
    else if(root.leftTree != null ) getDataLeaves(root.leftTree);
    else getDataLeaves(root.rightTree);

    return list;
}

我可以(我如何)使用我的 numberOfLeaves 函数的功能/样式来帮助我编写一个 recursive 函数来总结所有叶子的数据在列表中并返回它。

注意: 节点的类型为BinaryTree&lt;String&gt;dataleftTreeRightTree 作为实例变量。

【问题讨论】:

  • 这对于擅长递归的人来说应该是件容易的事,我的大脑还没有习惯递归来帮助自己。提前谢谢 :)

标签: java recursion binary-tree


【解决方案1】:

您应该添加递归调用返回的叶子:

public ArrayList<String> getDataLeaves(BinaryTree<String> root) {

    ArrayList<String> list = new ArrayList<>();

    if (root == null) 
        return list;
    else if (root.isLeaf()) 
        list.add(root.data);
    else { 
        list.addAll(getDataLeaves(root.leftTree));
        list.addAll(getDataLeaves(root.rightTree));
    }

    return list;
}

【讨论】:

  • 我想做一个跨树的前序遍历,如果节点是叶子,则将其添加到列表中。我的尝试示例并没有真正做到我认为的那样,所以我的代码中的这个添加不起作用(它不起作用,它在我的 9 个节点的树中只返回 1 个节点)。
  • @coders 它应该只返回叶子节点。你的树中有多少叶节点?
  • 9 个节点的二叉树中的 4 个叶节点 @Eran
  • @coders 你确定你的isLeaf 方法实现正确吗?
  • 是的,这是丢失的,需要一个接一个地添加呼叫。现在可以使用了,谢谢
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 2011-05-08
  • 2016-01-24
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
相关资源
最近更新 更多