二进制搜索树差分密钥

时间:2016-12-02 14:01:52

标签: java recursion data-structures binary-tree binary-search-tree

我昨天问过这个问题,但我仍然完全迷失方向。我正在尝试编写两个方法,一个包装方法和一个名为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;,但之后我很困惑。 以下是该方法应该执行的操作的示例: Example of sigma() method

辅助方法应返回BST中所有差分键之和的值(本例中为-1),然后包装器方法将该值添加到根节点的值(本例中为10)。因此,差分键和sigma()返回的值之和为10 +( - 1)= 9。

我遇到的主要问题是在辅助方法中实现递归解决方案。我可以轻松地在纸上追踪解决方案,但我似乎无法在我的项目中实现这一点。我无法在网上找到任何关于此的资源,我的教授没什么帮助。我实现辅助方法的尝试包含在上面的代码中。任何帮助表示赞赏。

1 个答案:

答案 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的原始值,而不是差异