参数分配未按预期工作

时间:2017-03-09 23:55:32

标签: java binary-tree binary-search-tree

我正在使用二叉搜索树进行类分配。我正在尝试通过将新节点分配给递归方法参数来替换具有不同节点的节点。

node = minNode(node.right);未按预期工作。它会修改参数SearchTreeNode<E> node,但此更改不会传播到this.overallRoot。例如,如果树的根是5,并且我们删除5,并且替换将是7,即使参数节点已经更改为7,this.overallRoot仍然是5.请参阅下面的屏幕截图。

知道我做错了吗?

public void remove(E data) {
    if (this.overallRoot != null) {
        this.removeData(this.overallRoot, data);
    }
}

private void removeData(SearchTreeNode<E> node, E data) {
    if (node.data == data) {
        if (node.left == null && node.right == null) {
            node = null;
        } else if (node.left != null && node.right != null) {
            node = minNode(node.right);
        } else if (node.right == null) {
            node = node.left;
        } else if (node.left == null) {
            node = node.right;
        }
    } else if (data.compareTo(node.data) < 0) {
        this.removeData(node.left, data);
    } else if (data.compareTo(node.data) > 0) {
        this.removeData(node.right, data);
    }
}

private SearchTreeNode<E> minNode(SearchTreeNode<E> node) {
    if (node.left == null) {
        return node;
    }
    return minNode(node.left);
}

Debugging code overallRoot with data 5 node with data 7

1 个答案:

答案 0 :(得分:1)

您的诊断完全正确:修改node没有任何好处,因为node是一个局部变量。对参数的修改不会传播给调用者。

可以修改node.leftnode.right。这些变化是显而易见的。您需要重新构建代码才能利用它。这不是一个快速修复。

或者,您可以向removeData的调用者返回一个值,并让调用者更改相应的变量。这也需要一些思考来确定每个removeData分支的回报。调用它看起来像:

node.left = this.removeData(node.left, data);