我有一个BST,并希望在满足一定深度后剪切树。我试图遍历树时遇到NullPointerException
,将节点设置为想要为空的深度。
我的逻辑是否适合我在这里所做的事情?这似乎是一个非常简单的问题,但我似乎无法理解导致此错误的原因。
public void clip(int d) {
int counter = 0;
clip_helper(d, root, counter);
}
public void clip_helper(int depth, Node n, int c) {
if (n != null) {
c++;
if (c == depth) {
n.left = null;
n.right = null;
}
}
clip_helper(depth, n.left, c);
clip_helper(depth, n.right, c);
}
*还应该补充一点,我对递归解决方案还是比较新的,所以我可能会遗漏那些显而易见的东西。
答案 0 :(得分:1)
你应该改变:
if(n.left!=null && n.right!=null) {
clip_helper(depth, n.left, c);
clip_helper(depth, n.right, c);
}
到:
if(c==depth) {
clip_helper(depth, n.left, c);
clip_helper(depth, n.right, c);
}
或:
{{1}}
因为clip_helper的递归调用不会停止。
答案 1 :(得分:1)
clip_helper(depth, n.left, c);
clip_helper(depth, n.right, c);
这些行导致NullPointer异常,因为您的程序永远不会结束 即使Node n为null,它仍然会向左和向右导致此
要解决此问题,只需在代码顶部添加空检查条件
即可if(n==null)
return;
答案 2 :(得分:1)
如果Node为null,则应返回
public void clip(int d) {
int counter = 0;
clip_helper(d, root, counter);
}
public void clip_helper(int depth, Node n, int c) {
if(n== null ) return;
if (n != null) {
c++;
if (c == depth) {
n.left = null;
n.right = null;
}
}
clip_helper(depth, n.left, c);
clip_helper(depth, n.right, c);
}