递归删除BST

时间:2017-01-19 07:57:50

标签: java recursion binary-search-tree

我有一个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);
}

*还应该补充一点,我对递归解决方案还是比较新的,所以我可能会遗漏那些显而易见的东西。

3 个答案:

答案 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);
}