在 C++ 中查詢 BST 中具有給定和的數對


在本教程中,我們將編寫一個程式,該程式查詢在二叉搜尋樹中其和等於給定數字的數對。

我們將把樹的值儲存在兩個不同的列表中以查詢數對。讓我們看看解決問題的步驟。

  • 為二叉樹建立一個結構體節點。

  • 編寫一個函式以將新節點插入到二叉搜尋樹中。

    • 記住,在二叉搜尋樹中,所有小於根的元素都較小,而右邊的元素都較大。

  • 初始化兩個空列表以儲存樹的左節點和右節點。

  • 迭代二叉搜尋樹,直到左節點或右節點為 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

結論

如果您在本教程中有任何疑問,請在評論部分中提出。

更新於:2021年2月1日

瀏覽量:150

啟動您的職業生涯

完成課程後獲得認證

開始學習
廣告
© . All rights reserved.