⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gensplay.h

📁 这是清华出的这本经典的数据结构第三版上的随书例子。希望对大家有用。
💻 H
字号:
//****************************  genSplay.h  ****************************//                     generic splaying tree class#ifndef SPLAYING#define SPLAYINGtemplate<class T> class SplayTree;template<class T>class SplayingNode {public:    SplayingNode() {        left = right = parent = 0;    }    SplayingNode(const T& el, SplayingNode *l = 0, SplayingNode *r = 0,                 SplayingNode *p = 0) {        info = el; left = l; right = r; parent = p;    }    T info;    SplayingNode *left, *right, *parent;};template<class T>class SplayTree {public:    SplayTree() {        root = 0;    }    void inorder() {        inorder(root);    }    T* search(const T&);    void insert(const T&);protected:    SplayingNode<T> *root;    void rotateR(SplayingNode<T>*);    void rotateL(SplayingNode<T>*);    void continueRotation(SplayingNode<T>* gr, SplayingNode<T>* par,                          SplayingNode<T>* ch, SplayingNode<T>* desc);    void semisplay(SplayingNode<T>*);    void inorder(SplayingNode<T>*);    void virtual visit(SplayingNode<T>*) {    }};template<class T>void SplayTree<T>::continueRotation(SplayingNode<T>* gr, SplayingNode<T>* par,                                    SplayingNode<T>* ch, SplayingNode<T>* desc) {    if (gr != 0) { // if p has a grandparent;         if (gr->right == ch->parent)              gr->right = ch;         else gr->left  = ch;    }    else root = ch;    if (desc != 0)        desc->parent = par;    par->parent = ch;    ch->parent = gr;}template<class T>void SplayTree<T>::rotateR(SplayingNode<T>* p) {    p->parent->left = p->right;    p->right = p->parent;    continueRotation(p->parent->parent,p->right,p,p->right->left);}template<class T>void SplayTree<T>::rotateL(SplayingNode<T>* p) {    p->parent->right = p->left;    p->left = p->parent;    continueRotation(p->parent->parent,p->left,p,p->left->right);}template<class T>void SplayTree<T>::semisplay(SplayingNode<T>* p) {    while (p != root) {        if (p->parent->parent == 0)    // if p's parent is the root;             if (p->parent->left == p)                  rotateR(p);             else rotateL(p);        else if (p->parent->left == p) // if p is a left child;             if (p->parent->parent->left == p->parent) {                  rotateR(p->parent);                  p = p->parent;             }             else {                  rotateR(p); // rotate p and its parent;                  rotateL(p); // rotate p and its new parent;             }        else                          // if p is a rigth child;             if (p->parent->parent->right == p->parent) {                  rotateL(p->parent);                  p = p->parent;             }             else {                  rotateL(p); // rotate p and its parent;                  rotateR(p); // rotate p and its new parent;             }        if (root == 0)              // update the root;            root = p;    }}template<class T>T* SplayTree<T>::search(const T& el) {    SplayingNode<T> *p = root;    while (p != 0)        if (p->info == el) {        // if el is in the tree,             semisplay(p);          // move it upward;             return &p->info;        }        else if (el < p->info)             p = p->left;        else p = p->right;    return 0;}template<class T>void SplayTree<T>::insert(const T& el) {    SplayingNode<T> *p = root, *prev = 0, *newNode;    while (p != 0) {  // find a place for inserting a new node;        prev = p;        if (el < p->info)             p = p->left;        else p = p->right;    }    if ((newNode = new SplayingNode<T>(el,0,0,prev)) == 0) {         cerr << "No room for new nodes\n";         exit(1);    }    if (root == 0)    // the tree is empty;         root = newNode;    else if (el < prev->info)         prev->left  = newNode;    else prev->right = newNode;}template<class T>void SplayTree<T>::inorder(SplayingNode<T> *p) {     if (p != 0) {         inorder(p->left);         visit(p);         inorder(p->right);     }}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -