这是家庭作业,不要发布代码。拜托,谢谢。
我被指派创建一个计算BST中特定深度的方法。
要做到这一点,我要@Override
方法public int depth(T data)
。因此,为了递归地找到它,我需要创建一个辅助方法。
我知道我需要在树中搜索具有我正在寻找的数据的节点。所以,为此,我编写了以下代码:
@Override
public int depth(T data) {
if (data == null) {
throw new IllegalArgumentException("Data is null");
}
if (compare(data, root.getData()) == 0) {
return 1;
} else {
return countNodes(search(root, data), data);
}
}
private int countNodes(BSTNode<T> node, T data) {
int depth = 1;
if (node == null) {
return 0;
} else {
if (compare(data, node.getData()) == 0) {
return depth;
} else if (compare(data, node.getData()) < 0) {
return countNodes(node.getLeft(), data);
} else {
return countNodes(node.getRight(), data);
}
}
}
private int compare(T a, T b) {
return a.compareTo(b);
}
然而,这不起作用,因为每次递归调用时depth
将保持1
;基本上,它正在重置深度值。我不知道如何在两次调用之间保持depth
的值。
答案 0 :(得分:1)
如果当前节点是您正在查找的节点或下一个节点的深度加上一个,如果您需要继续查看,则深度方法应返回一个。
例如:
N5
N3 N7
N1 N4 N6
你想知道N1的深度。
你从根开始:
N1!= N5所以你返回一个加上你在N3上检查的结果。 (1 +(N3检查的结果))
N1!= N3所以你返回一个加上你在N1上检查的结果。 (1 +(1 +(N1检查的结果)))
N1 == N1所以你返回一个。 (1 +(1 +(1)))
(1 +(1 +(1)))= 3
这是正确的深度,是初始深度调用将返回的内容。