📜  使用STL集将二叉树转换为二叉搜索树(1)

📅  最后修改于: 2023-12-03 15:36:37.457000             🧑  作者: Mango

使用STL集将二叉树转换为二叉搜索树

二叉搜索树(Binary Search Tree)是一种使得查找、插入、删除操作都具有较高效率的二叉树。对于给定的一棵二叉树,我们可以通过使用STL集来将其转换为二叉搜索树。本文将介绍如何使用STL集实现这个过程。

实现过程

实现过程主要包含以下几个步骤:

  1. 将二叉树的所有节点放入一个vector中;
  2. 通过排序算法将vector中的节点排序;
  3. 将排序后的节点依次插入一个新的BST中。

这里借助STL集实现二叉搜索树的插入将大大简化我们的代码,因为STL集底层已经使用了二叉搜索树进行实现。

下面是实现过程的代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;

struct node
{
    int val;
    node* left;
    node* right;
};

void inOrder(node* root, vector<node*>& vec)
{
    if (root == nullptr) return;
    inOrder(root->left, vec);
    vec.push_back(root);
    inOrder(root->right, vec);
}

node* buildBST(vector<node*>& vec, int left, int right)
{
    if (left > right) return nullptr;
    int mid = left + (right - left) / 2;
    node* root = vec[mid];
    root->left = buildBST(vec, left, mid - 1);
    root->right = buildBST(vec, mid + 1, right);
    return root;
}

node* convertToBST(node* root)
{
    vector<node*> vec;
    inOrder(root, vec);
    sort(vec.begin(), vec.end(), [](node* a, node* b) {return a->val < b->val;});
    return buildBST(vec, 0, vec.size() - 1);
}

int main()
{
    /* 构建二叉树 */
    node a, b, c, d, e, f;
    a = {4, &b, &c};
    b = {2, &d, &e};
    c = {6, nullptr, &f};
    d = {1, nullptr, nullptr};
    e = {3, nullptr, nullptr};
    f = {7, nullptr, nullptr};
    node* root = &a;

    /* 将二叉树转换为二叉搜索树 */
    root = convertToBST(root);

    /* 输出转换完成的二叉搜索树 */
    cout << root->val << ' ' << root->left->val << ' ' << root->right->val << endl;

    return 0;
}
解析
  1. 函数inOrder用于遍历二叉树并将其节点放入vector中;
  2. 函数buildBST用于递归地构建二叉搜索树;
  3. 函数convertToBST用于执行转换过程,包括先遍历二叉树、排序和构建新的二叉搜索树。
总结

本文介绍了使用STL集将二叉树转换为二叉搜索树的实现过程。通过使用STL集,我们可以非常方便地实现二叉搜索树的插入操作,从而大大简化了转换过程的实现。