概念
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。
一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:
- 它的左右子树都是AVL树
- 左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)
简单来说,AVL树的任何一个节点作为根节点来看的话,它左右子树的最高层数和最低层数差值只能小于等于1
AVL树的实现
由于要实现AVL树的增删改查,所以定义AVL树的节点,就需要定义parent,否则插入节点时,不知道要链接到树里面哪个节点下面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| #include <iostream> using namespace std;
struct Node { int key; Node* left; Node* right; int height; };
int getHeight(Node* node) { if (node == nullptr) { return 0; } return node->height; }
int getBalanceFactor(Node* node) { if (node == nullptr) { return 0; } return getHeight(node->left) - getHeight(node->right); }
void updateHeight(Node* node) { node->height = max(getHeight(node->left), getHeight(node->right)) + 1; }
Node* rightRotate(Node* node) { Node* leftChild = node->left; node->left = leftChild->right; leftChild->right = node; updateHeight(node); updateHeight(leftChild); return leftChild; }
Node* leftRotate(Node* node) { Node* rightChild = node->right; node->right = rightChild->left; rightChild->left = node; updateHeight(node); updateHeight(rightChild); return rightChild; }
Node* insertNode(Node* node, int key) { if (node == nullptr) { Node* newNode = new Node; newNode->key = key; newNode->left = nullptr; newNode->right = nullptr; newNode->height = 1; return newNode; } if (key < node->key) { node->left = insertNode(node->left, key); } else if (key > node->key) { node->right = insertNode(node->right, key); } else { return node; } updateHeight(node); int balanceFactor = getBalanceFactor(node); if (balanceFactor > 1 && key < node->left->key) { return rightRotate(node); } if (balanceFactor < -1 && key > node->right->key) { return leftRotate(node); } if (balanceFactor > 1 && key > node->left->key) { node->left = leftRotate(node->left); return rightRotate(node); } if (balanceFactor < -1 && key < node->right->key) { node->right = rightRotate(node->right); return leftRotate(node); } return node; }
void inorderTraversal(Node* node) { if (node == nullptr) { return; } inorderTraversal(node->left); cout << node->key << " "; inorderTraversal(node->right); }
int main() { Node* root = nullptr; root = insertNode(root, 10); root = insertNode(root, 20); root = insertNode(root, 30); root = insertNode(root, 40); root = insertNode(root, 50); root = insertNode(root, 25);
cout << "中序遍历结果:"; inorderTraversal(root); cout << endl;
return 0; }
|