当前位置: 首页 > 编程笔记 >

在C ++中的BST中找到具有给定总和的对

邹德泽
2023-03-14
本文向大家介绍在C ++中的BST中找到具有给定总和的对,包括了在C ++中的BST中找到具有给定总和的对的使用技巧和注意事项,需要的朋友参考一下

在本教程中,我们将编写一个程序,在二进制搜索树中找到总和等于给定数字的对。

我们将在两个不同的列表中存储树的值和树的值以查找对。让我们看看解决问题的步骤。

  • 为二叉树创建一个结构节点。

  • 编写一个函数以将新节点插入二进制搜索树。

    • 请记住,在二叉搜索树中,所有小于root的元素都较小,而right则较大。

  • 初始化两个空列表以存储树的左右节点。

  • 遍历二进制搜索树,直到左或右节点为NULL或两个列表都不为空。

    • 如果左侧节点值大于或等于右侧节点值,则中断循环。

    • 如果两个值的和等于给定的数字,则打印并中断循环。

    • 如果两个值的总和小于给定的数字,则从左侧列表中删除最后一个节点,然后移至该节点的右侧。

    • 如果两个值的和大于给定的数字,则从右侧列表中删除最后一个节点,然后移至该节点的左侧。

    • 编写一个循环以将所有元素存储到左侧节点列表中。

    • 编写一个循环以将所有元素存储到正确的节点列表中。

    • 从每个列表中获取最后一个节点。

    • 检查两个值。

示例

让我们看一下代码。

#include<bits/stdc++++.h>
using namespace std;
struct Node{
   int data;
   Node *left, *right, *root;
   Node(int data) {
      this->data = data;
      left = NULL;
      right = NULL;
      root = NULL;
   }
};
Node* insertNewNode(Node *root, int data){
   if (root == NULL) {
      root = new Node(data);
      return root;
   }
   if (root->data < data) {
      root->right = insertNewNode(root->right, data);
   }
   else if (root->data > data) {
      root->left = insertNewNode(root->left, data);
   }
   return root;
}
void findThePairs(Node *node, int target) {
   vector<Node*> left_side_nodes;
   vector<Node*> right_side_nodes;
   Node *current_left = node;
   Node *current_right = node;
   while (current_left != NULL || current_right != NULL || (left_side_nodes.size() > 0 && right_side_nodes.size() > 0)) {
      while (current_left != NULL) {
         left_side_nodes.push_back(current_left);
         current_left = current_left->left;
      }
      while (current_right != NULL) {
         right_side_nodes.push_back(current_right);
         current_right = current_right->right;
      }
      Node *left_side_node = left_side_nodes[left_side_nodes.size() - 1];
      Node *right_side_node = right_side_nodes[right_side_nodes.size() - 1];
      int left_side_value = left_side_node->data;
      int right_side_value = right_side_node->data;
      if (left_side_value >= right_side_value) {
         break;
      }
      if (left_side_value + right_side_value < target) {
         left_side_nodes.pop_back();
         current_left = left_side_node->right;
      }
      else if (left_side_value + right_side_value > target) {
         right_side_nodes.pop_back();
         current_right = right_side_node->left;
      }
      else {
         cout << left_side_node->data << " " << right_side_node->data << endl;
         break;
      }
   }
}
int main() {
   Node *root = NULL;
   root = insertNewNode(root, 25);
   root = insertNewNode(root, 20);
   root = insertNewNode(root, 30);
   root = insertNewNode(root, 15);
   root = insertNewNode(root, 21);
   root = insertNewNode(root, 19);
   root = insertNewNode(root, 31);
   findThePairs(root, 36);
}
输出结果

如果执行上述程序,将得到以下结果。

15 21

结论

 类似资料:
  • 问题内容: 给定一个非负整数数组和一个数字。您需要打印总和等于给定整数的子数组的所有开始和结束索引。 例如 : Explanation : [3, 6] [9], [9,0] These all are the subarrays with their sum equal to 9. 问题答案: 解决这个问题的基本蛮力方法是生成给定数组的所有子数组,然后遍历生成的子数组并计算总和,如果这个总和等于

  • 本文向大家介绍编写Golang程序以在数组中找到具有给定总和的对(O(nlogn)),包括了编写Golang程序以在数组中找到具有给定总和的对(O(nlogn))的使用技巧和注意事项,需要的朋友参考一下 例子 输入数组= [1、3、5、7、8、9],总和= 11 =>(3,8) 解决这个问题的方法 步骤1: 定义一个接受数组和sum的方法。 步骤2: 对给定的数组进行排序,声明low:= 0和hi

  • 最近在一次工作面试中,我被要求在给定约束条件下求两个数组的最大和。这个问题措辞不同,但归结起来就是我上面所说的。没有提到元素是不同的,或者数组是被排序的。 例子: 请注意,由于约束,这与在2个数组中查找第k个最大和的对不同。 一个蛮力解是取2个数组的笛卡尔积,计算每对的和,过滤掉大于7000的,排序,取相等的顶值,时间复杂度为O(n2),我们能做的更好吗?

  • 本文向大家介绍编写Golang程序以在数组(O(n))中查找具有给定总和的对,包括了编写Golang程序以在数组(O(n))中查找具有给定总和的对的使用技巧和注意事项,需要的朋友参考一下 例子 输入数组= [1、3、5、7、8、9],总和= 11 =>(3,8) 解决这个问题的方法 步骤1: 定义一个接受数组和sum的方法。 步骤2: 定义一个映射变量,输入map [int] int。 步骤3:将

  • 问题内容: 我有一些复杂的对象,例如猫,它具有许多属性,例如年龄,喜爱的猫食等等。 Java集中存储了一堆猫,我需要查找所有3岁的猫,或者最喜欢猫粮的Whiskas。当然,我可以编写一个自定义方法来查找那些具有特定属性的Cat,但是这样做会麻烦许多属性。有一些通用的方法吗? 问题答案: 您可以编写一个采用接口实例的方法,该实例定义了一个方法,该方法可以通过所需的任何属性检查来实现。 更好的是,使其

  • 我有一个GoogleSheets触发器功能,它可以在表单提交中根据为我的一个问题选择的值将提交内容放置在表单中。我正在尝试使用“作为附加项进行测试”功能测试我的函数,但是当我提交表单时,我在我的函数中收到一个错误,错误消息是来自触发器 这是错误的一行, 这使我认为存在身份验证问题,但我不确定如何进一步调试 完整代码: