【问题标题】:Counting nodes with a specific value in a binary tree计算二叉树中具有特定值的节点
【发布时间】:2019-05-11 00:21:56
【问题描述】:

我试图想出一种方法来递归地而不是迭代地遍历二叉树,并计算找到特定值的次数。我遇到的一个问题是第一种方法中的根。

节点内部类:

private class Node {

    int data;
    Node root;
    Node left;
    Node right;
}

递归和辅助方法:

public int valCount(int val) {
    if (root != null) {
        return valCount(val, root);
    }
    return 0;
}

public int valCount(int val, Node root) {
    int cnt = 0;
    if (root.left != null) {
        if (root.left.data == val) {
            cnt++;
        }
        valCount(val, root.left);
    }


    if (root.right != null) {
        if (root.right.data == val) {
            cnt++;
        }
        valCount(val, root.right);
    }
    return cnt;
}

由于根本问题,我无法进行测试,所以我不完全确定我的输出是否正确。所以,这个问题需要问......我是否走在正确的轨道上?我的方法是否有意义?任何帮助都是极好的。干杯!

【问题讨论】:

  • 在递归调用中也传递cnt 并在class 范围内定义cnt

标签: java recursion binary-tree


【解决方案1】:

每次调用valCount 时,都会创建局部变量cnt单独副本。因此,当您为根调用 valCount 时,这会创建一个变量 cnt;当valCount 为左子树或右子树调用自己时,新的valCount 有其自己的 cnt,因此当它们增加cnt 时,它们会 增加第一个 valCount 拥有的 cnt。这意味着valCount 为左右子树所做的所有工作都被丢弃了。

解决此问题的一种简单方法是注意,当您为左子树或右子树调用 valCount 时,递归调用将返回一个值。您应该使用该值,而不是丢弃结果:

int leftCount = valCount(val, root.left);

然后用leftCount做点什么(我让你想想怎么用)。

编辑: 还有一件事:valCount 应该查看 root.data,但不应该查看 root.left.dataroot.right.data。让递归调用完成查看子树中数据的工作。这就是二叉树递归通常的工作原理。

【讨论】:

    【解决方案2】:

    您的 Node 类中不需要“root”。 “根”是“this”对象/指针,对吧?将另一个参数“int[] cnt”传递给 valCount。将 cnt 实例化为 int[1]。然后在 valCount 中执行 cnt[0]++。在递归结束后的调用函数中,打印出 cnt[0]。并删除 cnt 局部变量。

    【讨论】:

      【解决方案3】:

      每次递归调用该方法时,都会创建一个新的 cnt 对象,其值为 0。这意味着每次增加它时,值都会丢失。 解决此问题的一个好方法是将 cnt 放在方法的参数中,因此每次调用它时都会传递 cnt 的新值。

      【讨论】:

      • 这只是对已接受答案的低质量改写。
      猜你喜欢
      • 1970-01-01
      • 2014-05-10
      • 2021-10-10
      • 2023-03-25
      • 2021-01-02
      • 2012-01-30
      • 2016-11-24
      • 1970-01-01
      • 2020-02-21
      相关资源
      最近更新 更多