【问题标题】:BST largest key less than k and at a depth not less than xBST 小于 k 且深度不小于 x 的最大密钥
【发布时间】:2022-07-22 16:29:42
【问题描述】:

我发布这个问题只是为了好奇,这不是家庭作业。这是我的一次考试的问题,我8年前毕业了。 问题是这样的:

定义一个高效的递归算法,给bst一个正整数x,k从bst中删除包含小于k且深度不小于x的最大key的节点 不允许使用通过引用传递的全局变量或参数

我已经解决了问题,但是老师说我没有使用 bst 属性。解决办法是这样的:

Algo(T, x, k){
  temp = funz(T, x, k, 0);
  if(temp != NIL)
    T = delete(T, temp[k]); // standard delete algo
  
  return T;
}

Funz(T, x, k, dis){
  
  l= NIL;
  r = NIL;
  
  if(T = NIL)
    return T;
  if(dis < x){
    l = Funz(T->sx, x, k, dis + 1);
    r = Funz(T->dx, x, k, dis + 1);
    return Max(l, r); // return the maximum key nil otherwise
  }
  else
    return Predecessor(T, k); // standard predecessor algo

}

我知道密钥必须位于树的某些区域,所以我们可以排除树的某些部分,但是深度的限制让我感到困惑。

有人可以帮忙吗?

问候

【问题讨论】:

    标签: algorithm binary-search-tree


    【解决方案1】:

    确实,您的算法没有使用二叉搜索树的特性。

    这个想法是首先找到一个候选节点而不考虑深度要求。如果该节点的深度很好,则返回它。否则查看该节点的左子树以找到更深的候选节点。 如果同样失败,则回溯。

    这是您的Funz 函数的外观:

    function Funz(T, x, k, depth) {
      if (T == NIL)
        return NIL;
      if (T->data >= k) // Too great. Look among lesser values
        return Funz(T->left, x, k, depth + 1);
      // We have a candidate (but depth could still be an issue)
      // Try to improve (get closer to k)
      improved = Funz(T->right, x, k, depth + 1);
      if (improved != NIL) // Found an improvement
        return improved;
      // No improvement found
      if (depth >= x) // Base case
        return T;
      // Not deep enough. Try lesser value
      return Funz(T->left, x, k, depth + 1);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 2014-02-21
      相关资源
      最近更新 更多