繁体   English   中英

在二叉树中对具有特定值的节点进行计数

[英]Counting nodes with a specific value in a binary tree

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

节点内部类:

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;
}

由于根本原因,我无法进行测试,因此我不确定我的输出是否正确。 所以,这个问题很待问...我什至在正确的轨道上吗? 我的方法甚至有意义吗? 任何帮助都是极好的。 干杯!

每次调用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 让递归调用完成查看子树中数据的工作。 这就是二叉树递归经常工作的方式。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM