C++ 使用队列反转 BST 中的路径

c++server side programmingprogramming

给定一个二叉搜索树,我们需要从特定键反转其路径,例如。

寻找解决方案的方法

在这种方法中,我们将创建一个队列并推送所有节点,直到我们得到根。

示例

 
#include <bits/stdc++.h>
using namespace std;
struct node {
   int key;
   struct node *left, *right;
};
struct node* newNode(int item){
   struct node* temp = new node;
   temp->key = item;
   temp->left = temp->right = NULL;
   return temp;
}
void inorder(struct node* root){
   if (root != NULL) {
       inorder(root->left);
       cout << root->key << " ";
       inorder(root->right);
   }
}
void Reversing(struct node** node,
           int& key, queue<int>& q1){
   /* 如果树为空则
   return*/
   if (node == NULL)
        return;
   if ((*node)->key == key){ // 如果我们找到密钥
       q1.push((*node)->key); // 我们将其推送到队列中
       (*node)->key = q1.front(); // 我们用当前元素替换第一个队列元素
       q1.pop(); // 我们弹出第一个元素
   }
   else if (key < (*node)->key){ // 如果 key 小于当前节点的值
       q1.push((*node)->key); // 我们将元素推送到队列中
       Reversing(&(*node)->left, key, q1); // 我们使用递归调用转到左子树
       (*node)->key = q1.front(); // 我们反转元素
        q1.pop(); // 我们弹出第一个元素
   }
   else if (key > (*node)->key){ // 如果 key 大于节点 key 则
       q1.push((*node)->key);// 我们将节点 key 推送到队列中
       Reversing(&(*node)->right, key, q1);// 我们使用递归调用转到右子树
       (*node)->key = q1.front();// 将队列前端替换为节点 key
       q1.pop(); // 我们弹出第一个元素
   }
   return;
}
struct node* insert_node(struct node* node, // 在我们的 BST 中插入节点的函数
                          int key){
    if (node == NULL)
         return newNode(key); // 如果树为空,则返回一个新节点
    if (key < node->key) // 否则,我们将其推送到树中
        node->left = insert_node(node->left, key);
   else if (key > node->key)
        node->right = insert_node(node->right, key);
   return node; // 返回节点
}
int main(){
   struct node* root = NULL;
   queue<int> q1;
   int k = 80;
/****************Creating the BST*************************/
   root = insert_node(root, 50);
   insert_node(root, 30);
   insert_node(root, 20);
   insert_node(root, 40);
   insert_node(root, 70);
   insert_node(root, 60);
   insert_node(root, 80);
   cout << "反转前:<< "\n";
   inorder(root);
   cout << "\n";
   Reversing(&root, k, q1);
   cout << "反转后:<< "\n";
   // 打印反向路径树的中序
   inorder(root);
   return 0;
}

输出

反转前:
20 30 40 50 60 70 80
反转后:
20 30 40 80 60 70 50

上述代码的解释

在这种方法中,我们只需搜索给定的键。当我们遍历树时,我们将所有节点推送到队列中,现在当我们找到具有键值的节点时,我们交换所有排在前面的路径节点的值,在此过程中,我们的路径被反转。

结论

我们使用队列和递归解决了 BST 中反转路径的问题。我们还学习了这个问题的 C++ 程序和我们解决这个问题的完整方法(正常)。我们可以用其他语言(例如 C、java、python 和其他语言)编写相同的程序。我们希望您觉得本教程有用。


相关文章