BST 二叉搜索树 C++ 算法导论

来源:互联网 发布:vmware安装mac os x 编辑:程序博客网 时间:2024/06/10 14:25

BST 二叉搜索树 C++ 算法导论

算法全是看算法导论的,这的确是本好书,值得收藏。只是看着有点脑袋疼。。。。(开溜。。。。)

#include <iostream>#include <cstdlib>using namespace std;template<class T>struct BST_Node {//节点数据结构    T key;    BST_Node<T> *left, *right, *parent;//左、右孩子、父节点    BST_Node() { key = 0; left = right = parent = nullptr; }    BST_Node(T key, BST_Node *left, BST_Node *right, BST_Node *parent) {        this->key = key;        this->left = left;        this->right = right;        this->parent = parent;    }};template <class T>class BSTree {//二叉搜索树public:    BSTree() { root = 0; }    ~BSTree() { this->destroy(this->root); }    bool insert_key(const T z);    bool search_key(BST_Node<T> *&x, const T key) const;    bool delete_key(const T key);    bool is_empty_tree()const { return this->root == nullptr; }    T min_element() const;    T max_element() const;    BST_Node<T> *successor(BST_Node<T> *x) const;//前驱节点    BST_Node<T> *predecessor(BST_Node<T> *x) const;//后继节点    void inOrder();//中序遍历private:    BST_Node<T> *root;//根节点    BST_Node<T> *min_element(BST_Node<T> *x) const;    BST_Node<T> *max_element(BST_Node<T> *x) const;    BST_Node<T> *inOrder(BST_Node<T> *x);    BST_Node<T> *delete_key(BST_Node<T> *&t, BST_Node<T> *z);    void destroy(BST_Node<T> * t);};inline void menu() {    cout << "1、插入新值\n2、查找值\n3、删除值\n";    cout << "4、最大值\n5、最小值\n6、退出\n";}inline void cls() { system("pause"); system("cls"); }inline void output(BSTree<long long> *tree) { tree->inOrder(); cout << endl; cls();}int main(){    BSTree<long long> *tree = new BSTree<long long>();    BST_Node<long long> * t = nullptr;    long long select = 0, x = 0;    bool loop = true;    while (loop) {        if (!tree->is_empty_tree()) { cout << "中序遍历: \n"; tree->inOrder(); cout << endl; }        menu();        cin >> select;        switch (select) {            case 1: {                cout << "输入key:" << endl;                cin >> x;                cout << (tree->insert_key(x) == true ? "插入成功\n" : "插入失败\n") << "操作后中序遍历的结果: \n";                output(tree);                break;            }            case 2: {                cout << "输入查找的key:" << endl;                cin >> x;                cout << (tree->search_key(t, x) == true ? "找到了\n" : "未找到\n");                cls();                break;            }            case 3: {                cin >> x;                cout << (tree->delete_key(x) == true ? "删除成功\n" : "删除失败\n") << "操作后中序遍历的结果: \n";                output(tree);                break;            }            case 4: cout << "最大值: " << tree->max_element() << endl; output(tree); break;            case 5: cout << "最小值: " << tree->min_element() << endl; output(tree); break;            case 6: loop = false; break;            default: cout << "指令不正确,请重新输入\n"; cls(); break;        }    }    return 0;}template<class T>bool BSTree<T>::insert_key(const T key){    BST_Node<T> *x = nullptr, *y = nullptr, *z = nullptr;    x = this->root;    z = new BST_Node<T>(key, nullptr, nullptr, nullptr);    if (z == nullptr) return false;    while (x != nullptr) {        y = x;        if (z->key < x->key) x = x->left;        else x = x->right;    }    z->parent = y;    if (y == nullptr) this->root = z;    else if (z->key < y->key) y->left = z;    else y->right = z;    return true;}template<class T>bool BSTree<T>::search_key(BST_Node<T> *&x,const T key) const{    x = this->root;    while (x != nullptr && key != x->key) {        if (key < x->key) x = x->left;        else x = x->right;    }    return x == nullptr ? false : true;}template<class T>bool BSTree<T>::delete_key(const T key){    BST_Node<T> *x = nullptr, *y = nullptr;    if (this->search_key(x, key) == true) {        if ((y = this->delete_key(this->root, x)) != nullptr) {            delete y;            return true;        }    }    return false;}template<class T>BST_Node<T>* BSTree<T>::delete_key(BST_Node<T>*& t, BST_Node<T>* z){    BST_Node<T> *x = nullptr, *y = nullptr;    if (z->left == nullptr || z->right == nullptr) y = z;    else y = this->successor(z);    if (y->left != nullptr) x = y->left;    else x = y->right;    if (x != nullptr) x->parent = y->parent;    if (y->parent == nullptr) t = x;    else if (y == y->parent->left) y->parent->left = x;    else y->parent->right = x;    if (y != z) z->key = y->key;    return y;}template<class T>void BSTree<T>::destroy(BST_Node<T>* t){    if (t == nullptr) return;    if (t->left != nullptr) this->destroy(t->left);    if (t->right != nullptr) this->destroy(t->right);    delete t;}template<class T>T BSTree<T>::min_element() const{    return (this->min_element(this->root))->key;}template<class T>T BSTree<T>::max_element() const{    return (this->max_element(this->root))->key;}template<class T>BST_Node<T> *BSTree<T>::min_element(BST_Node<T>* x) const{    if (x == nullptr)return nullptr;    while (x->left != nullptr) x = x->left;    return x;}template<class T>BST_Node<T> *BSTree<T>::max_element(BST_Node<T>* x) const{    if (x == nullptr)return nullptr;    while (x->right != nullptr) x = x->right;    return x;}template<class T>BST_Node<T>* BSTree<T>::inOrder(BST_Node<T>* x){    if (x != nullptr) {        this->inOrder(x->left);        cout << x->key << " ";        this->inOrder(x->right);    }    return nullptr;}template<class T>BST_Node<T>* BSTree<T>::successor(BST_Node<T>* x) const{    if (x->right != nullptr) return this->min_element(x->right);    BST_Node<T> *y = x->parent;    while (y != nullptr && x == y->right) {        x = y;        y = y->parent;    }    return y;}template<class T>BST_Node<T>* BSTree<T>::predecessor(BST_Node<T>* x) const{    if (x->left != nullptr) return this->max_element(x->left);    BST_Node<T> *y = x->parent;    while (y != nullptr && x == y->left) {        x = y;        y = y->parent;    }    return y;}template<class T>void BSTree<T>::inOrder(){    this->inOrder(this->root);}

附上算法导论二叉搜索树讲解截图,非常感谢这本书的作者。

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述