【问题标题】:Range Search in BSTBST 中的范围搜索
【发布时间】:2015-11-20 13:33:23
【问题描述】:

我需要在二叉搜索树中执行范围搜索功能,这将给出给定范围内的项目数。我不明白如何在找到项目时增加计数值。因为,我必须使用递归函数&如果我在递归过程中将计数变量初始化为 0,它将始终从 0 开始计数值,而不是计数中已更新的计数值。

    int rangeSearch(struct treeNode * node, int leftBound, int rightBound) 
    {

        int count=0;
        if( node->item >= leftBound & node->item <= rightBound)
        {
            printf("%d ",node->item);
            count++;
        }
        if( node->left!=0 & node->item > leftBound) rangeSearch( node -> left, leftBound , rightBound );
        else if( node->right!=0 & node->item < rightBound )rangeSearch( node -> right, leftBound , rightBound );
        return count;


    }

【问题讨论】:

  • 你需要使用递归调用的返回值...

标签: c binary-search-tree


【解决方案1】:

这是我的第一个答案,所以我很抱歉我的英语不好。

在每一个这样的递归问题中,考虑问题的最简单方法是:

-解决“基本情况”,这通常是微不足道的。 (对于大多数数据结构,这通常是空结构或单元素结构。)

-根据构成结构的子结构来解决一般情况,(例如,在考虑树时,这是考虑到左子树和右子树来完成的)假设您可以依靠子结构的解决方案。

我确定我没有很好地解释它,所以让我做一个简单的例子:

我们要计算 BST 中元素的总数。 解决方法是这样的:

int countElement(struct treeNode* node)
{
    if(node == null)
    {
        //we are in the base case: the tree is empty, so we can return zero.
        return 0;
    }
    else
    {
        /*the tree is not empty:
          We return 1 (the element that we are considering)
          + the elements of the left subtree 
          + the elements of the right subtree.*/

          return 1 + countElement(node->left) + countElement(node->right);
    }   
}

如果您清楚这一点,我们可以继续处理您的请求:

int rangeSearch(struct treeNode * node, int leftBound, int rightBound)
{
    if(node == 0)
    {
        //base case: the tree is empty, we can return 0
        return 0;
    }
    else
    {
        /*our tree is not empty.
          Remember that we can assume that the procedure called on
          the left and right child is correct.*/

          int countLeft = rangeSearch(node->left, leftBound, rightBound);
          int countRight = rangeSearch(node->right, leftBound, rightBound);

          /*So what we have to return?
          if the current node->item is between leftbound and rightbound,
          we return 1 (our node->item is valid) + rangeSearch called
          on the left and child subtree with the same identical range.*/

          if(node->item > leftBound && node->item < rightBound)
          {
              /*the element is in the range: we MUST count it 
                in the final result*/
              return 1 + countLeft + countRight;
          }
          else
          {
              /*the element is not in the range: we must NOT count it 
                in the final result*/
              return 0 + countLeft + countRight;
          }
    }
}

请记住,所有的关键部分是,如果你定义和解决了基本情况,那么当你考虑更大的结构时,你可以假设你的递归过程调用的 SUBSTRUCTURE 做正确的事情并返回正确的价值。

【讨论】:

  • 很好解释!! :) 谢谢哥们!!
  • 另一个问题:你能解释一下c++中使用模板的函数声明格式吗?
【解决方案2】:

据我了解,由于countrangeSearch 中是本地的,因此必须对实现进行如下更改以达到所需的评估。

int rangeSearch(struct treeNode * node, int leftBound, int rightBound)
{

    int count=0;
    if( node->item >= leftBound & node->item <= rightBound)
    {
        printf("%d ",node->item);
        count++;
    }
    if( node->left!=0 & node->item > leftBound)
        count += rangeSearch( node->left, leftBound, rightBound );
    if( node->right!=0 & node->item < rightBound )
        count += rangeSearch( node->right, leftBound, rightBound );
    return count;
}

【讨论】:

  • 您可能还需要在您的else if 中删除else
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 2019-08-12
  • 1970-01-01
  • 2011-07-22
相关资源
最近更新 更多