【问题标题】:how to write a recursive function that would return the minimum values in a BST?如何编写一个递归函数来返回 BST 中的最小值?
【发布时间】:2018-05-23 03:41:08
【问题描述】:

我正在尝试编写一个递归函数来返回 二叉搜索树中的最小值。

int RecursiveFindMin(Tree t) {
  if (t==NULL)
    return -1;
  else {
    if (t!=NULL)
        RecursiveFindMin(t->left);
  }

  return t->val;   
}

我希望得到 BST 中的最小值

相反,我得到的是第二小的结果,大多数时候! 我不太擅长递归函数,我将不胜感激 帮忙!

【问题讨论】:

  • 这里不需要递归,因为最小值位于最左边的叶子中,可以通过简单的迭代找到。在您的函数中,您将丢弃递归调用的返回值。
  • @EugeneSh。我想任务要求他们使用递归
  • @HunterMcMillen 没错!

标签: c recursion binary-search-tree


【解决方案1】:

您正在返回每个左节点值。所以最后它返回根值。您应该找到最左边的节点并将该值固定为最小值。

const int kInf = 100000000;
int RecursiveFindMin(Tree t) {
    if (t == NULL) return kInf;
    int v = RecursiveFindMin(t->left);
    return v == kInf? t->val : v;   
}

我已将 kInf 用于树中不存在的值。

【讨论】:

  • const int kInf = 100000000; - 你是如何选择这个常数的。?可能是 0x7fffffff(考虑 4bytes for int)更有意义?
  • 这只是一个占位符值。该值应该是不在树中的任何值。
【解决方案2】:

当您对函数进行递归调用时,您会丢弃返回值。所以递归实际上什么都不做。您所做的只是返回传入的第一个节点的值。

您也没有使用正确的退出条件。您不想在当前节点为 NULL 时停止(因为那时您可以用它做什么?),而是在 left 节点为 NULL 时停止。那么你想要的值就在那个节点中。

所以改变条件检查左节点,并返回递归调用的值:

int RecursiveFindMin(Tree t) {
  if (t->left==NULL)
    return t->val;   
  else {
    return RecursiveFindMin(t->left);
  }
}

【讨论】:

  • @M.Hamra 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多