当前位置: 首页 > 知识库问答 >
问题:

如何打印值介于最小值和最大值之间的所有BST节点

嵇光临
2023-03-14

我有以下BST供参考。英国夏令时

假设最小值:9 和最大值:20 它满足所有条件,对于每个节点 (X),左侧子树中的所有节点都小于,并且右侧子树中的所有节点都大于 X 的值。

我在创建打印所有值的函数(成员函数,因此它可以访问根节点)时遇到了问题。具体来说,假设我的当前节点是10,但是我仍然需要检查左右两边的子树。我不能在参数中传递节点(否则我会这样做?),所以我要实现这个功能

void printBetween(int min, int max);

此外,函数应该只访问值可能有效的子树。

假设节点结构如下所示:

struct Node{
        T data_;
        Node* left_;
        Node* right_;
        Node(const T& data, Node* left=nullptr, Node* right=nullptr){
            data_=data;
            left_=left;
            right_=right;
        }        
    };

如果左子项和右子项的值都可以介于最小值和最大值之间,我将如何处理?

void printBetween(int min, int max){
    // left child: smaller than
    // right child: bigger than
    // This function prints every value in the tree that is between min and max inclusive.

    if( root_ == nullptr)
        cout << "No values found" << endl;
    Node* currNode = root_;

   // check until currNode is a valid node 
    while(currNode != nullptr){
        // print value if currNode's data value is between min and max inclusive,
        if(currNode->data_ > min && currNode->data_ <= max){
            cout << "Value: " << data_ << "," << endl;
            fnd = true;
            // since it falls in the range, have to check both children
            // not sure what to do here??
            if(currNode != nullptr && currNode->left_->data_ > min && currNode->left_->data_ <= max){
                 currNode = currNode->left_;   
            } else if(currNode != nullptr && currNode->right_->data_ > min && currNode->right_->data_ <= max){
                 currNode = currNode->right_; 
            }
        }

        // current node's data is too big, so go to its left child
        if(currNode->data_ > max){
            currNode = currNode->left_;
        } 
        // current node's data is too small, so go to its right child
        else if(currNode->data_ < min){
            currNode = currNode->right_;
        } 
    }
}

共有1个答案

丌官盛
2023-03-14

首先,<code>void printBetween(int min,int max)有一个小问题 int应为T。您还应该考虑将minmaxby

如果左子项和右子项的值都可以介于最小值和最大值之间,我将如何处理?

在这些情况下,您需要同时搜索它们。您可以添加一个递归调用的助手成员函数。在下面的例子中,我称之为< code>printer()。您的< code>printBetween()仅用于调用起始值为< code>root_的< code>printer()。

void printer(const T& min, const T& max, Node* currNode) {
    if(currNode == nullptr) return; // end of branch, return

    if(currNode->data_ >= min && currNode->data_ <= max) {     // [min, max]
        // we got a match, both branches must be followed

        printer(min, max, currNode->left_); // call printer for the smaller values

        std::cout << "Value: " << currNode->data_ << '\n';

        printer(min, max, currNode->right_); // call printer for the greater values

    } else if(currNode->data_ < min) {
        // data is less than min, no need to search the left branch
        printer(min, max, currNode->right_);

    } else {
        // data is greater than max, no need to search the right branch
        printer(min, max, currNode->left_);
    }
}

void printBetween(const T& min, const T& max) {
    printer(min, max, root_);
}

另一个注意事项:如果您打算将BST用于非默认构造的类型,您需要使用< code>Node中的成员初始化列表。

例子:

struct Node {
    T data_;
    Node* left_;
    Node* right_;

    Node(const T& data, Node* left=nullptr, Node* right=nullptr) :
        data_(data),
        left_(left),
        right_(right)
    {
        // empty function body
    }        
};

演示

 类似资料:
  • 我有一个任务,给我一个随机生成的BST的根。我得到了随机生成的测试用例。 分配说明如下: 您将得到二叉搜索树的根节点T和两个整数:min和max。确定存储在T中大于或等于min且小于或等于max的所有键的总和。递归地实现算法 我不允许使用全局变量或创建辅助函数 我当前的代码是: 我的问题是,如果在递归过程中的任何时候,节点都会触发基本情况,并导致我的函数无法正确完成。我相信我的命令可能是罪魁祸首。

  • 我刚刚开始在HackerRank上练习,以提高我的编码技巧。我主要使用Java作为我的首选语言。我已经得到了这个问题,我已经尽力给出了解决方案,但没有清除所有的测试用例。我已经清除了15个测试用例中的5个,但仍有10个需要完成。那些在hackerrank上的人可以通过以下链接看到这个问题:最小-最大和 无论如何,我给出了这个问题的简要描述: 问题陈述 给定五个正整数,通过将五个整数中的恰好四个求和

  • 我有一个这样的数据帧: 必修的: 相关链接:pandas groupby的最小和最大行 pandas groupby中两个系列的最大值和最小值 pandas groupby中的最大和最小日期 单击groupby,然后按列的值(例如,最小值、最大值)选择一行

  • 本文向大家介绍使用递归实现指定最小值和最大值之间的所有整数求和相关面试题,主要包含被问及使用递归实现指定最小值和最大值之间的所有整数求和时的应答技巧和注意事项,需要的朋友参考一下 循环 function sumNumber(min, max) { let result = 0 for (let i = min+1; i<max;i++){ result += i } return result }

  • 问题内容: 我正在寻找python中整数的最小值和最大值。例如,在Java中,我们有和。python中是否有类似的东西? 问题答案: Python 3 在Python 3中,此问题不适用。普通int类型是无界的。 但是,你实际上可能正在寻找有关当前解释器的字长的信息,在大多数情况下,该信息将与机器的字长相同。该信息在Python 3中仍以形式提供,这是一个有符号的单词可以表示的最大值。等效地,它是

  • 主要内容:普通算法,分治算法程序中,我们经常使用数组(列表)存储给定的线性序列(例如 {1,2,3,4}),那么如何查找数组(序列)中的最大值或者最小值呢? 查找数组(序列)中最大值或最小值的算法有很多,接下来我们以 {3,7,2,1} 序列为例讲解两种查找最值的算法,一种是普通算法,另一种是借助 分治算法解决。 普通算法 普通算法的解决思路是:创建两个变量 max 和 min 分别记录数组中的最大值和最小值,它们的初始值都