我试图想出一种方法来递归地遍历二叉树而不是迭代地遍历并计算找到特定值的次数。我遇到的一个问题是第一种方法的根源。
节点内部类:
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;
}
由于root问题我无法测试,所以我不完全确定我的输出是否正确。所以,问题有待提出......我是否在正确的轨道?我的方法是否有意义?任何帮助都是极好的。干杯!
答案 0 :(得分:2)
每次调用valCount
时,都会创建局部变量cnt
的单独副本。因此,当您为根调用valCount
时,会创建变量cnt
;当valCount
为自己的左子树或右子树调用时,新valCount
的拥有 cnt
,所以当他们增加cnt
时,他们会不增加第一个cnt
拥有的valCount
。这意味着valCount
为左右子树完成的所有工作都将被丢弃。
解决此问题的一种简单方法是注意,当您为左子树或右子树调用valCount
时,递归调用将返回一个值。您应该使用该值,而不是丢弃结果:
int leftCount = valCount(val, root.left);
然后使用leftCount
做一些事情(我会让你考虑如何使用它)。
编辑:还有一件事:valCount
应该看root.data
,但不应该看root.left.data
或root.right.data
。让递归调用执行查看子树中数据的工作。这就是二叉树递归常常起作用的方式。
答案 1 :(得分:1)
您的Node类中不需要“root”。 “root”是“this”对象/指针,对吗?将另一个参数“int [] cnt”传递给valCount。将cnt实例化为int [1]。然后在valCount中执行cnt [0] ++。在递归结束后的调用函数中,打印出cnt [0]。并删除cnt局部变量。
答案 2 :(得分:-1)
每次递归调用该方法时,都会创建一个新的cnt对象,该对象的值为0。这意味着,每次递增该值时,该值都会丢失。 解决此问题的一种好方法是将cnt放在方法的参数中,因此,每次调用它时,都传递新的cnt值。