sigma()
的递归辅助方法,定义如下:
/**
* A wrapper method for a method that computes the
* sum of the differential keys of this binary search tree.
* @return the sum of the differential keys of this tree.
*/
@Override
public int sigma()
{
if (size == 0)
return 0;
if (root.data.getClass() != Integer.class)
throw new IllegalArgumentException("Keys must be integers");
return (Integer)root.data + sigma(root);
}
/**
* An auxiliary method that recursively computes the sum of
* differential keys in the subtrees of the tree rooted at
* the specified key.
* @param subtreeRoot the root of a subtree of this tree
* @return the sum of the differential keys of the left and
* right subtrees
*/
private int sigma(Node subtreeRoot)
{
// My attempt at implementing the auxiliary method
if(subtreeRoot == null) return 0;
return sigma(subtreeRoot.left) - (Integer)subtreeRoot.data +
sigma(subtreeRoot.right) - (Integer)subtreeRoot.data;
}
注意:我们不允许向任一方法添加任何参数或修改包装器方法内的代码。
差异键的定义:
定义1。如果节点是节点,则元素为整数的二叉树中节点的差分键是节点中的元素。 根或是节点中的元素与其之间的差异 家长。 null 节点的差异为0。
我已经介绍了基本案例if(subtreeRoot == null) return 0;
,但之后我很困惑。
以下是该方法应该执行的操作的示例:
辅助方法应返回BST中所有差分键之和的值(本例中为-1),然后包装器方法将该值添加到根节点的值(本例中为10)。因此,差分键和sigma()返回的值之和为10 +( - 1)= 9。
我遇到的主要问题是在辅助方法中实现递归解决方案。我可以轻松地在纸上追踪解决方案,但我似乎无法在我的项目中实现这一点。我无法在网上找到任何关于此的资源,我的教授没什么帮助。我实现辅助方法的尝试包含在上面的代码中。任何帮助表示赞赏。
答案 0 :(得分:0)
你可以尝试的是计算自下而上的差异。更新子项的所有节点后,您将更新父项。
private int sigma(Node subtreeRoot)
{
// My attempt at implementing the auxiliary method
if(subtreeRoot == null)
return 0;
else {
if(subtreeRoot.left != null){
subtreeRoot.left.data = sigma(subtreeRoot.left) - subtreeRoot.data;
}
if(subtreeRoot.right != null){
subtreeRoot.right.data = sigma(subtreeRoot.right) - subtreeRoot.data;
}
return subtreeRoot.data;
}
}
请注意,每个方法调用都会返回节点subtreeRoot
的原始值,而不是差异