avl树的C++实现

最后更新于:2022-04-01 16:17:27

这里给出了C++代码的实现。关于AVL树的C语言的实现参见《[AVL树(Adelson-Velskii-Landis tree)](http://blog.csdn.net/u013074465/article/details/44672567)》 ~~~ //3avl_tree_c++.h #ifndef AVL_TREE_cplusplus_H #define AVL_TREE_cplusplus_H #include <iostream> using namespace std; template <typename Comparable> class AvlTree { public: AvlTree():root(NULL) {} AvlTree(const AvlTree &rhs): root(NULL) { *this = rhs; } ~AvlTree() { makeEmpty(); } const Comparable &findMin() const { if (isEmpty()) cout << "树为空" << endl; return findMin(root)->element; } const Comparable &findMax() const { if (isEmpty()) cout << "树为空" << endl; return findMax(root)->element; } bool contains(const Comparable &x) const { return contains(x, root); } bool isEmpty() const { return root == NULL; } void printTree() const { if (isEmpty()) cout << "Empty tree." << endl; else { cout << "先序:"; printTreePreOrder(root); cout << endl << "中序:"; printTreeInOrder(root); cout << endl << "后序:"; printTreePostOrder(root); } cout << endl; } void makeEmpty() { makeEmpty(root); } void insert(const Comparable &x) { insert(x, root); } void remove(const Comparable &x) { remove(x, root); } const AvlTree &operator=(const AvlTree &rhs) { if (this != &rhs) { makeEmpty(); root = clone(rhs.root); } return this; } private: struct AvlNode { Comparable element; AvlNode *left; AvlNode *right; int height; AvlNode(const Comparable &theElement, AvlNode *l, AvlNode *r, int h = 0): element(theElement), left(l), right(r), height(h) {} }; AvlNode *root; void insert(const Comparable &x, AvlNode* &t) { if (t == NULL) t = new AvlNode(x, NULL, NULL); else if (x < t->element) { insert(x, t->left); if (height(t->left) - height(t->right) == 2) if (x < t->left->element) rotateWithLeftChild(t); else doubleWithLeftChild(t); } else if (x > t->element) { insert(x, t->right); if (height(t->right) - height(t->left) == 2) if (t->right->element < x) rotateWithRightChild(t); else doubleWithRightChild(t); } else ; //要往树中插入已经存在的元素,什么也不做 t->height = max(height(t->left), height(t->right)) + 1; } void remove(const Comparable &x, AvlNode* &t) { if (t == NULL) return; if (x < t->element) { remove(x, t->left); if (height(t->right) - height(t->left) == 2) { if (height(t->right->left) > height(t->right->right)) doubleWithRightChild(t); else rotateWithRightChild(t); } } else if (x > t->element) { if (height(t->left) - height(t->right) == 2) { if (height(t->left->right) > height(t->left->left)) doubleWithLeftChild(t); else rotateWithLeftChild(t); } } else if (t->left && t->right) { //找到要删除的位置,t有两个孩子 t->element = findMin(t->right)->element; remove(t->element, t->right); t->height = max(height(t->left), height(t->right)) + 1; } else { AvlNode *oldNode = t; t = (t->left == NULL) ? t->right : t->left; delete oldNode; } if (t != NULL) t->height = max(height(t->left), height(t->right)) + 1; } AvlNode *findMin(AvlNode *t) const { if (t == NULL) return NULL; if (t->left == NULL) return t; return findMin(t->left); } AvlNode *findMax(AvlNode *t) const { //注释部分为递归 //if (t == NULL) // return NULL; //if (t->right == NULL) // return t; //return findMax(t->right); //非递归形式 if (t != NULL) while (t->right != NULL) t = t->right; return t; } bool contains(const Comparable &x, AvlNode *t) const { if (t == NULL) return false; else if (x < t->element) return contains(x, t->left); else if (x > t->element) return contains(x, t->right); else return true; } /* //非迭代操作 bool contains(const Comparable &x, AvlNode *t) { while (t != NULL) { if (x < t->element) t = t->left; else if (x > t->element) t = t->right; else return true; } return false; } */ void makeEmpty(AvlNode* &t) { if (t != NULL) { makeEmpty(t->left); makeEmpty(t->right); delete t; } t = NULL; } void printTreePreOrder(AvlNode *t) const { if (t != NULL) { cout << t->element << " "; printTreePreOrder(t->left); printTreePreOrder(t->right); } } void printTreeInOrder(AvlNode * t) const { if (t != NULL) { printTreeInOrder(t->left); cout << t->element << " "; printTreeInOrder(t->right); } } void printTreePostOrder(AvlNode * t) const { if (t != NULL) { printTreePostOrder(t->left); printTreePostOrder(t->right); cout << t->element << " "; } } AvlNode *clone(AvlNode *t) const { if (t == NULL) return NULL; return new AvlNode(t->element, clone(t->left), clone(t->right)); } int height(AvlNode *t) const { return t == NULL ? -1 : t->height; } int max(int lhs, int rhs) { return lhs > rhs ? lhs : rhs; } //单旋转,左-左 void rotateWithLeftChild(AvlNode * & k2) { AvlNode *k1 = k2->left; k2->left = k1->right; k1->right = k2; k2->height = max(height(k2->left), height(k2->right)) + 1; k1->height = max(height(k1->left), height(k1->right)) + 1; k2 = k1; } //单旋转,右-右 void rotateWithRightChild(AvlNode * & k1) { AvlNode *k2 = k1->right; k1->right = k2->left; k2->left = k1; k1->height = max(height(k1->left), height(k1->right)) + 1; k2->height = max(height(k2->left), height(k2->right)) + 1; k1 = k2; } //双旋转,左-右 void doubleWithLeftChild(AvlNode * & k3) { rotateWithRightChild(k3->left); rotateWithLeftChild(k3); } //双旋转,右-左 void doubleWithRightChild(AvlNode * & k3) { rotateWithLeftChild(k3->right); rotateWithRightChild(k3); } }; #endif ~~~ 测试代码: ~~~ #include "3avl_tree_c++.h" int main() { AvlTree<int> tree; int i = 0; while (i != 9) { tree.insert(i++); } tree.printTree(); cout << endl << "删除11但11不存在:" << endl; tree.remove(11); tree.printTree(); cout << endl << "删除 5和8:" << endl; tree.remove(5); tree.remove(8); tree.printTree(); return 0; } ~~~ ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-07_575683a4e1142.jpg)
';